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

时间:2014-06-08 10:12:46

标签: redis

我的Redis设置了密钥' a'和价值' 1',' 2',' 3'。 有没有办法为集合中的每个键值对设置不同的到期时间。

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

1 个答案:

答案 0 :(得分:8)

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

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

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

并使用' 1 a 60 1'和' 1 a 120 2'作为参数,根据你的例子。实际上"到期"来自集合的项目,您需要在时间过后删除它们。您可以通过实施扫描列表或访问列表的定期流程来实现。例如,以下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')