【问题标题】:my redis keys do not expire我的 redis 密钥不会过期
【发布时间】:2012-08-04 15:44:48
【问题描述】:

当生存时间达到0时,我的redis服务器不会删除键。

这是一个示例代码:

redis-cli
>SET mykey "ismykey"
>EXPIRE mykey 20
#check TTL
>TTL mykey
>(integer) 17
> ...
>TTL mykey
>(integer) -1
#mykey chould have expired:
>EXISTS mykey
>(integer) 1
>#oh still there, check its value
>GET mykey
>"ismykey"

如果我检查 redis 返回的信息,它会说 0 个密钥已过期。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: redis ttl cache-expiration


    【解决方案1】:

    由于您正在执行“...”,因此很难确定,但我会说您在该部分设置 mykey,这将有效地消除过期。

    From the EXPIRE manual

    只有在使用 DEL 删除密钥时才会清除超时 命令或使用 SET 或 GETSET 命令覆盖

    Also, regarding the -1 reply from TTL

    返回值

    整数回复:以秒为单位的 TTL 或 -1 当密钥不存在时 存在或没有超时。

    编辑:请注意,此行为在 Redis 2.8 中发生了变化

    从 Redis 2.8 开始,发生错误时的返回值发生了变化:
    如果密钥不存在,该命令返回 -2。
    如果密钥存在但没有关联的过期,则该命令返回 -1。

    换句话说,如果您的密钥存在,它似乎是持久的,即没有任何过期设置。

    编辑:如果我在 REDIS 从服务器上创建密钥,我似乎可以重现这一点,从服务器不会在没有主输入的情况下删除密钥,因为通常您不会在从服务器上本地创建密钥。这里是这样吗?

    但是,虽然连接到主服务器的从服务器不会使密钥过期 独立(但会等待来自主控的 DEL), 他们仍将采用现有的 expires 的完整状态 数据集,所以当一个奴隶被选为一个主人时,它将能够 独立使密钥过期,完全充当主人。

    【讨论】:

    • 感谢您如此迅速的回复。我的 sn-p 中的 '...' 仅意味着我等待 20 秒,直到 TTL 返回 -1。我在这里不输入任何命令。所以到期应该一直到结束,不是吗?
    • 感谢约阿希姆!正是这一点,我无意中将我的密钥设置在从机而不是主机上,这是不一致的。如果我切换到我的主人一切正常。
    • @JoachimIsaksson "TTL in seconds or -1 when key does not exist or does not have a timeout." 如果密钥不存在不返回-2?
    • @Djack 显然在我写完答案后行为发生了变化,添加了新行为的编辑,谢谢。
    • 在从属设备上创建密钥后,我也遇到了类似的问题。在我的情况下,redis TTL 给出了 0 并且它没有删除密钥。我的redis版本是2.8
    猜你喜欢
    • 2017-09-18
    • 2017-02-12
    • 2020-09-26
    • 2020-04-19
    • 2016-04-25
    • 1970-01-01
    • 2023-03-04
    • 2014-07-20
    • 2016-12-05
    相关资源
    最近更新 更多