我有一个函数 lettuce
与redis集群对话。
在这个函数中,我将数据插入到流数据结构中。
import io.lettuce.core.cluster.SlotHash;
...
public void addData(Map<String, String> dataMap) {
var sync = SlotHash.getSlot(key).sync()
sync.xadd(key, dataMap);
}
我还想在第一次插入记录时设置ttl。这是因为用户需求的一部分是在固定的时间长度后使结构过期。在这种情况下是10个小时。
不幸的是 XADD
函数不接受像 SET
功能。
所以现在我设置ttl如下:
public void addData(Map<String, String> dataMap) {
var sync = SlotHash.getSlot(key).sync()
sync.xadd(key, dataMap);
sync.expire(key, 60000 /* 10 hours */);
}
确保i只设置一次过期时间(即流结构首次创建时)的最佳方法是什么?我不应该在函数中多次设置ttl,因为每次调用 xadd
接下来还会有一个 expire
有效地延长了有效期。
我想我可以随时检查流数据结构中的项数,但这是一项开销。我不想在java应用程序端保留标志,因为应用程序可以重新启动,并且这些信息将从内存中删除。
1条答案
按热度按时间9rygscc11#
您可能想尝试lua脚本,下面的示例脚本仅在未为key设置时设置过期时间,它可以与redis中的任何类型的key一起使用。
脚本还返回以秒为单位的实际到期时间。