【问题标题】:Redis: To set timeout for a key value pair in SetRedis:为 Set 中的键值对设置超时
【发布时间】:2014-07-29 02:18:05
【问题描述】:

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

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    很遗憾,没有。 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')
    

    【讨论】:

    • 非常感谢您的解释,有没有关于如何使用 Python 实现此目的的示例。
    • 添加了一些 Python 代码(虽然未经测试) - 希望这会让您更容易实现 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2019-07-25
    相关资源
    最近更新 更多