如何确保Redis中的流数据结构仅设置一次?

问题描述 投票:0回答:1

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

java redis lettuce
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.