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

标签 redis

我有一个 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/24105074/

相关文章:

asp.net - 我如何从进程中慢慢迁移到使用 Redis 作为 session 状态提供程序?

c# - 加入 Redis 的替代方案

redis - Geo-redis,存储附加数据

laravel - docker : Worker keep exiting and respawn and 99% CPU

node.js - 无法在 sailsjs 中获取 redis session

java - 一个项目,很多tomcat发生session被替换

nosql - 存储非平稳分布的数据库

redis - 构建 Redish 哈希存储的首选方式

python - 向 rabbitmq 发送 celery 任务消息

redis - 如何知道jedis消息有没有推送