Hazelcast MapStore加载TTL

时间:2016-03-08 20:29:32

标签: java hazelcast hazelcast-imap

load使用MapStore custom 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轻松/轻松地完成这项工作,我可以忽略它?

2 个答案:

答案 0 :(得分:1)

截至Hazelcast版本3.6,没有一种好方法可以实现这一点,因此我需要使用原始帖子中确定的替代方案之一。

已记录

Hazelcast Issue 7728以解决此问题。

有关相关讨论,请参阅Hazelcast Google Group

答案 1 :(得分:0)

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

驱逐特定条目 上面解释的驱逐策略和配置适用于地图的所有条目。符合指定驱逐条件的条目被驱逐。

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

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

带有键“1”的地图条目将在放入myMap后50秒被驱逐。