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