【问题标题】:Storing keys with prefix that expire in redis在redis中存储带有过期前缀的键
【发布时间】:2020-04-03 06:09:57
【问题描述】:

尝试使用键前缀存储过期 x 时间的值

我正在使用 redis。我目前正在使用 hset 存储值

import redis


r = redis.StrictRedis('localhost')


for i in range(10):
    r.hset('name', i, i)


print(r.hgetall('name'))

我希望每个密钥都有不同的过期时间,因为我将单独存储每个密钥。

我该怎么做?

【问题讨论】:

    标签: python redis


    【解决方案1】:

    这不能直接完成。您可以在整个 hset 上添加过期时间,但不能在单个字段上添加过期时间。如果您想这样做,您可以调用r.expire('name', time),其中time 是到期前的秒数。

    作为替代方案,您可以使用set 代替hset

    for i in range(10):
        r.set('name:' + str(i), i, ex=time_to_expire_s)
    

    这将带走一些功能,因为(例如)您将无法列出所有以“name:”开头的键,但它可以让您独立设置键的到期时间。

    作为第二个选项,您可以在 hset 的值中设置过期时间。这需要客户端逻辑,Redis 不会为你做任何删除;但你可以这样做:

    for i in range(10):
        r.hset(
            'name',
            i,
            json.dumps({ 'value': i, 'expiration': time.time() + time_to_expire_s })
        )
    

    然后,如果您曾经读取过过期的值,您会认为这是缓存未命中。如果您尝试使密钥过期以释放内存,这对您没有帮助,但如果您的目标是出于某种正确性原因使密钥过期,这可能对您有用。

    【讨论】:

    • 我确实需要密钥过期,因为我可能会在一分钟内获得 1-2k 输入。想要存储这些,调用它们,然后让它们过期,因为会有新的 1-2k 输入。
    • 我想,我唯一仍然感到困惑的是,如果我按照你所说的那样将它们存储为一个集合,我遇到了查询它们的问题。所以不确定我将如何存储这些输入,因为它们是随机输入的。
    • 您的用例是什么?你已经解释了你想如何写入 Redis,但没有解释之后你想如何使用数据。
    • 我想显示最近完成的搜索。所以我从我的搜索栏获取搜索,将其存储在 redis 中,显示给其他用户
    • 每分钟有一个hset,然后显示最近M的内容怎么样?例如,拥有name + ":" + datetime.datetime.now().strftime("%Y-%m-%dT%H:%M") 之类的键,并让它们在 N > M 分钟后过期,然后在您处理显示结果时让应用程序逻辑组合最近 M 的结果。
    猜你喜欢
    • 2015-08-24
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2020-05-21
    相关资源
    最近更新 更多