【发布时间】:2014-07-29 02:18:05
【问题描述】:
我有一个 Redis 集,其键为“a”,值为“1”、“2”、“3”。 有没有办法为集合中的每个键值对设置不同的过期时间。
例如 ('a','1') 应该在 60 秒后过期,而 ('a','2') 应该在 120 秒后过期。
【问题讨论】:
标签: redis
我有一个 Redis 集,其键为“a”,值为“1”、“2”、“3”。 有没有办法为集合中的每个键值对设置不同的过期时间。
例如 ('a','1') 应该在 60 秒后过期,而 ('a','2') 应该在 120 秒后过期。
【问题讨论】:
标签: redis
很遗憾,没有。 Redis 的“容器”(即列表、哈希、集合和排序集合)不支持按成员过期,尽管过去曾多次请求此功能。
但是,您可以实现自己的逻辑来实现该结果。有几种可能的方法来解决这个问题 - 这是一个例子。不使用集合,而是使用排序集 (ZSET) 并使用 epoch 值将每个成员的分数设置为其到期时间。例如,这种类型的工作流可以使用 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”作为参数对其进行评估。
编辑:如何使用 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')
【讨论】: