使用 redission 客户端由于 redis TTL 丢失的集合对象

问题描述

我们正在使用 Redission 客户端 for java 从 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(Time-To-Live) 本身设置了特定密钥的到期时间,此后将无法再检索该密钥。如果您想将密钥保留在内存中,您可以完全跳过设置 rList.expire(7L,TimeUnit.SECONDS);(无限期)。

如果您想延长到期时间,可以通过重复 expire 命令来实现。也可以通过这种方式完全删除 TTL,尽管我无法告诉您如何专门使用 Redisson。

至于过期键,Redis 每秒清除它们 10 次 (according to this documentation),因此我认为您无法(始终)恢复过期键中的值。

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