Java 如何确保redis中的流数据结构只设置一次到期?
我有一个函数,可以使用Java 如何确保redis中的流数据结构只设置一次到期?,java,redis,lettuce,Java,Redis,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); } 确保I只设置一次到期时间(即首次创建流结构时)的最佳方法
莴苣
与redis集群进行通信
在这个函数中,我将数据插入到流数据结构中
import io.lettuce.core.cluster.SlotHash;
...
public void addData(Map<String, String> dataMap) {
var sync = SlotHash.getSlot(key).sync()
sync.xadd(key, dataMap);
}
确保I只设置一次到期时间(即首次创建流结构时)的最佳方法是什么?我不应该在函数中多次设置TTL,因为每次调用xadd
之后都会调用expire
,从而有效地无限期地推迟到期时间
我想我总是可以检查流数据结构中的项数,但这是一项开销。我不想在java应用程序端保留标志,因为应用程序可以重新启动,并且此信息将从内存中删除。您可能需要尝试lua脚本,下面的示例脚本仅在未设置为key的情况下设置过期时间,可用于redis中的任何类型的key
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
脚本还以秒为单位返回实际到期时间。您可能需要尝试lua脚本,下面的示例脚本仅在未设置密钥时设置到期时间,可用于redis中的任何类型的密钥
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
脚本还返回剩余的实际到期时间(以秒为单位)