Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保redis中的流数据结构只设置一次到期?_Java_Redis_Lettuce - Fatal编程技术网

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
脚本还返回剩余的实际到期时间(以秒为单位)