2016-03-08 107 views
3

有没有办法通过load导入地图条目custom TTL使用MapStoreHazelcast MapStore通过TTL加载

使用案例:我的每个映射条目都有一个自定义过期,此时条目不再有效(TTL不仅限制内存映射的大小,并且TTL应用于每个条目,而不是地图配置)。当我初始地址为put时,我设置了此TTL,过期时间保留在我的基础持久性映射数据存储中,但从数据库加载我的条目时无法重置此TTL。

public class MyMapStore implements MapStore<MayKey, MapValue> { 

    @Override 
    public MapValue load(MayKey key) { 
     MapValue value = datstore.lookup(key); 
     Date ttl = value.getExpiration(); 
     // the value has it's own entry-specific TTL, but it seems this can't be used from the MapStore 
     return value; 
    } 

    // . . . 

} 

MapLoader文档似乎表明这是不可能的:

加载项将被放入分布图,他们将 留在内存中,直到它们被显式删除或隐含逐出 (如果配置驱逐)。

如果没有办法用MapStore做到这一点,一些剩余的选项似乎是:

  • 不要使用MapStore,而是明确地查找条目从我 持久数据存储,装载与这些值所需的TTL
    • 这可能是可行的,但这种做法,我不再能够采取的MapStore
    • 好处 优势
  • 运行一个后台线程周期性明确驱逐这些过期的条目,而不是依赖于Hazelcast的自动驱逐
    • 这仅仅是一个很大的开销(附加线程,查询和录入处理),并要求我的应用程序代码检查条目的有效性在使用之前(因为在地图中可能存在过期的条目)

是否有任何其他方式来完成这项干净/轻松地与Hazelcast是我俯瞰?

回答

1

从Hazelcast 3.6版本开始,没有一种好方法可以实现这一点,所以我需要使用原始文章中标识的替代方案之一。

Hazelcast Issue 7728已记录到解决这个问题。

相关讨论请参见Hazelcast Google Group为好。

0

你检查:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#understanding-map-eviction

驱逐的具体条目 逐出策略和配置上面说明应用到地图的所有条目。符合特定驱逐条件的条目被驱逐出境。

但是你可能想要驱逐一些特定的地图条目。在这种情况下,可以使用方法map.put()的ttl和timeunit参数。下面给出了一个示例代码行。

myMap.put( “1”, “约翰”,50,TimeUnit.SECONDS)

的映射条目与键 “1”,将其放入MYMAP之后将被驱逐50秒。

+0

是的,这正是我使用当我第一次把项目到地图,但问题是,加载与MapStore条目时,我不能用这种方法。 – shelley