gpt4 book ai didi

java - 如何确保redis中的流数据结构的过期时间只设置一次?

转载 作者:行者123 更新时间:2023-12-01 16:42:59 35 4
gpt4 key购买 nike

我有一个使用 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 */);

}

确保我仅设置一次到期时间(即首次创建流结构时)的最佳方法是什么?我不应该在函数中多次设置 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

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

关于java - 如何确保redis中的流数据结构的过期时间只设置一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61822950/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com