问题描述
我们正在使用 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 刷新