gpt4 book ai didi

Redis:为Set中的键值对设置超时

转载 作者:可可西里 更新时间:2023-11-01 11:34:54 24 4
gpt4 key购买 nike

我有一个 Redis 集,键为“a”,值为“1”、“2”、“3”。有没有办法为集合中的每个键值对设置不同的过期时间。

例如 ('a','1') 应在 60 秒后过期,而 as ('a','2') 应在 120 秒后过期。

最佳答案

不幸的是,没有。 Redis 的“容器”(即列表、哈希、集合和排序集合)不支持每个成员的过期,尽管过去曾多次请求此功能。

但是,您可以实现自己的逻辑来实现该结果。有几种可能的方法来解决这个问题 - 这是一个例子。不使用集合,而是使用排序集合 (ZSET),并使用纪元值将每个成员的分数设置为其到期时间。这种类型的工作流可以使用例如 Lua 脚本来实现。要添加成员,请使用类似的东西:

redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])

并根据您的示例使用“1 a 60 1”和“1 a 120 2”作为参数对其进行 EVAL。要真正使集合中的项目“过期”,您需要在它们的时间结束后将其删除。您可以通过实现扫描列表或访问列表的定期过程来做到这一点。例如,可以使用以下 Lua 使成员过期:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())

并根据您的示例使用“1 a”作为参数对其进行 EVAL。

编辑:如何使用 Python 实现上述目标

import time
import redis

def add(r, key, ttl, member):
r.zadd(key, member, int(time.time()+ttl))

def expire(r, key):
r.zremrangebyscore(key, '-inf', int(time.time()))

...

r = redis.Redis()
add(r, 'a', 1, 60)
add(r, 'a', 2, 120)

# periodically or before every operation do
expire(r, 'a')

关于Redis:为Set中的键值对设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321588/

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