3

有没有办法使用自定义 TTL加载地图条目?MapStore

用例:我的每个映射条目都有一个自定义过期时间,此时条目不再有效(TTL 不仅用于限制内存映射的大小,而且 TTL 应用于每个条目,而不是地图配置)。我最初条目放入地图时设置了此 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 干净/轻松地完成此任务?

4

2 回答 2

1

从 Hazelcast 3.6 版开始,没有很好的方法来实现这一点,所以我需要使用原始帖子中确定的替代方案之一。

Hazelcast 问题 7728已被记录以解决此问题。

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

于 2016-03-11T14:41:22.967 回答
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 秒后被逐出。

于 2016-03-09T10:26:07.827 回答