【问题标题】:Redisson Cache Map does not evict if process is terminated如果进程终止,Redisson Cache Map 不会驱逐
【发布时间】:2019-08-03 05:26:01
【问题描述】:

我正在使用 Redisson 的 RMapCache 来处理我的应用程序中的一些分布式集合。

这些集合中的密钥应该会在一段时间后过期,所以在添加密钥时我设置了 TTL:

RMapCache<String, MyClass> cacheMap = GetMap("test");
cacheMap.put("DTO1", myClassInstance, 20, TimeUnit.SECONDS);

所以 20 秒后密钥应该过期。如果进程没有在到期时间戳之前终止,这将非常有效。但是,如果由于某种原因进程死亡,那么密钥永远不会被清除,这意味着驱逐是由 Java 进程中的 Redisson 处理的,而不是由 Redis 本身处理的。

有没有办法让redisson 使用Redis 内置的EXPIRE 功能?这样在 Map 中插入的进程不对键的驱逐负责。

我发现当前的 redisson 实现非常脆弱。

【问题讨论】:

    标签: java redis redisson


    【解决方案1】:

    一旦你在崩溃后创建了相同的 RMapCache 对象,它就会启动 evictionScheduler,这反过来会从 Redis 中清除过期的条目。

    如果你只想依赖 Redis 驱逐过程,那么使用 RBucket 对象。 Redis 不提供按 TTL 的映射条目过期时间。

    【讨论】:

    • 这里不是很清楚!您的意思是不应该使用 RMapCache 中每个条目的 TTL 吗? RMapCache 应该用作单例吗? RMap 有地图级别的 TTL 是否意味着如果它被用作单例它不能在 ttl 之后复活?虽然 Redisson 很棒,但这里令人困惑!
    • @Giri 在崩溃后创建相同的 MapCache 对象后,它将启动 evictionScheduler ,这将从 Redis 中清除过期条目。但是如果你只想依赖 Redis TTL 那么你可以使用 RBucket 对象。 RMap 无法恢复为整个实例设置的 TTL。
    • 我们是否需要将 RBucket 对象用作单例,或者如果我们每次都从客户端获取 RBucket 来使用就可以了?这里有什么建议?
    • @Giri RBucket 对象状态较少。每次都能拿到。
    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多