当前位置: 首页 > 知识库问答 >
问题:

Hazelcast MapStore使用TTL加载

龙令雪
2023-03-14

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

用例:“我的映射”条目都有一个自定义的过期期限,此时该条目不再有效(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;
    }

    // . . .

}

地图加载器文档似乎表明这可能不可能:

加载的条目将被放置到分布式映射中,它们将保留在内存中,直到显式删除或隐式逐出(如果配置逐出)。

如果无法使用MapStore完成此操作,则剩余的一些选项似乎是:

  • 不要使用MapStore,而是从我的持久数据存储中显式查找条目,使用所需的TTL加载这些值
    • 这可能是可行的,但是使用这种方法,我不再能够利用MapStore
    • 的好处
    • 这只是很大的开销(额外的线程、查询和条目处理),需要我的应用程序代码在使用之前检查条目的有效性(因为映射中可能存在过期条目)

    我忽略了Hazelcast有没有其他方法可以干净/轻松地完成这个任务?

共有2个答案

公良子轩
2023-03-14

您是否检查:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#understanding-地图逐出

驱逐特定条目上述驱逐策略和配置适用于地图的所有条目。满足指定驱逐条件的条目将被驱逐。

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

MyMap.put("1","John",50, TimeUnit. SECONDS)

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

房唯
2023-03-14

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

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

请参见Hazelcast谷歌小组的相关讨论。

 类似资料:
  • TTL

    TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 可用版本: >= 1.0.0 时间复杂度: O(1) 返回值: 当 key 不存在或没有设置生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间(以秒为单位)。 # 带 TTL 的key redis> SET name "redis" OK redis> EXPIRE name 30

  • 用户使用具有唯一的cookie请求/寻呼 node.js在redis(?)上使用此内标识创建用5分钟的TTL。%s具有类型。那么redis(?)应存储带有类型的令牌。 如果用户在过期之前再次返回,则的TTL再次重置为5分钟。 如果用户不再返回并且过期,则会触发一个函数。 最后,我还需要属于特定类型(即类型27)。 解决这个问题的最好办法是什么?redis是正确的选择吗?我如何计数和触发器5。如果我

  • 在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。 一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库功能聚焦 & 0依赖,支持Java 13/12/11/10/9/8/7/6。 JDK的InheritableThreadLocal类可以完成父线程到子线程的值传递。但对于使用线程池等会池化复用线程的执行组件的情况,线

  • 在Cosmos Db中,我使用的是文档级别的生存时间(TTL),并且Cosmos似乎没有过期文档。这个特性在使用MongoDB API的Cosmos Db中工作吗?如果是,我错过了什么? 我将Cosmos Db与MongoDB API一起使用。 在每个文档中为我的集合设置一个“TTL”字段。 在Azure中,我的集合的生存时间设置为“打开(无默认值)”。 我在没有模拟器的情况下执行此操作,因为模拟

  • 符合HBase规格: “ColumnFamilies可以以秒为单位设置TTL长度,一旦达到过期时间,HBase将自动删除行。这适用于行的所有版本,甚至是当前版本。在HBase中为行编码的TTL时间是在UTC中指定的。” null

  • 完整 RSS 参考手册