使用 redission 客户端的 redis TTL 导致集合对象丢失

Collection Object lost due to redis TTL using redission client

我们正在使用 java 的 Redission 客户端从 Redis 获取数据,但由于 TTL,对象从集合中删除。

例子

我们正在尝试使用以下方法通过 TTL 从 Redis 获取数据。

final RList rList = client.getList(getEnvCacheKey(cacheKey));

rList.expire(7L, TimeUnit.SECONDS);

rlist.add("Value1");

rlist.add("Value2");

assertThat(rList).containsOnly("Value1", "Value2"); // 这个条件在 7 秒前为真

现在 7 秒后 assert rlist.size() == 2 条件变为 false 因为对象引用因 TTL 而被删除。

因此,我们遇到了生产问题。有什么方法可以在 TTL 之后保留对象?任何形式的帮助将不胜感激。

TTL(生存时间)本身设置了特定密钥的到期时间,超过该密钥将无法再检索。如果您想将密钥保留在内存中,您可以完全跳过设置 rList.expire(7L, TimeUnit.SECONDS);(无限期)。

如果您想延长有效期,可以重复执行 expire 命令。也可以通过这种方式完全删除 TTL,尽管我无法告诉您具体如何使用 Redisson。

至于过期键,Redis 每秒清除它们 10 次 (according to this documentation),所以我认为您不能(始终如一地)恢复过期键中的值。

我的一般建议是退后一步,看看您的系统设计。如果您丢失了过期密钥,也许这部分产品应该得到扩展 TTL/no TTL/periodical TTL 刷新