我有一个使用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。
所以现在我以这种方式设置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应用程序端保留标志,因为该应用程序可以重新启动,并且该信息将从内存中删除。
您可能想尝试lua脚本,下面的示例脚本仅在未为任何密钥设置过期时才设置过期。
eval "local ttl = redis.call('ttl', KEYS[1]); if ttl == -1 then redis.call('expire', KEYS[1], ARGV[1]); end; return ttl;" 1 mykey 12
脚本还返回以秒为单位的实际到期时间。