java—如何确保redis中的流数据结构只设置一次到期?

zujrkrfu  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(418)

我有一个函数 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应用程序端保留标志,因为应用程序可以重新启动,并且这些信息将从内存中删除。

9rygscc1

9rygscc11#

您可能想尝试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

脚本还返回以秒为单位的实际到期时间。

相关问题