【问题标题】:Remove Redis key deletion behavior on expiration删除过期时的 Redis 键删除行为
【发布时间】:2021-11-11 21:08:01
【问题描述】:

我正在使用 Redis 密钥空间通知来在指定密钥过期时通知我的应用程序。

但是当密钥过期时,Redis 会删除该密钥,我需要删除此行为,因为我的应用程序可以在稍后使用此过期信息。

有没有办法消除这种行为?

【问题讨论】:

  • 绝对不是。
  • 这就是在密钥上设置过期时间的全部意义所在。如果您确实需要设置过期键的值,则需要重新考虑您的策略和/或应用程序。
  • 我明白了,我想我显然不得不求助于另一种策略,感谢您的回答

标签: redis stackexchange.redis


【解决方案1】:

正如@sazzad 和@nitrin0 所说,没有办法改变这一点。

作为获得类似结果的另一种选择,我建议您使用sorted set 来跟踪这些“伪过期”,当它们“过期”时,后台进程会执行您需要密钥的任何其他操作:移动它、转换它、重置过期等等。

使用命令zadd 来创建一个新的排序集并为其添加成员。集合的键可以是任何东西,但我会使用成员作为过期数据的键,这样您就可以轻松地处理真实数据和排序集中的成员。

ZADD name-of-sorted-set NX timestamp-when-data-expires key-of-real-data

让我们分解一下:

  • name-of-sorted-set 是您在其他 Z* 命令中用于处理此特定排序集的内容。
  • NX 表示“仅添加新元素。不要更新现有元素。”。另一个选项是XX,即“仅更新已经存在的元素。不要添加新元素”。为此,唯一的选项是 NX 或什么都没有。
  • timestamp-when-data-expires 是该成员的 score,当数据“过期”时,我们会将其用作确切的时间戳,因此您必须在应用程序中进行一些计算以提供时间戳,而不仅仅是直到它过期的秒数。
  • key-of-real-data 是用于此代表的真实数据的确切密钥。当您使用此排序集以查找哪些成员“过期”时,在此处使用确切的键将有助于轻松地将两者结合起来,因为成员是您用于移动、删除、转换数据的键。

接下来我会运行zrangebyscore 的后台进程来查看是否有任何成员的分数(时间戳)在某个范围内:

ZRANGEBYSCORE name-of-sorted-set min-timestamp max-timestamp WITHSCORES LIMIT 0 10

让我们也分解一下:

  • name-of-sorted-set 是我们在上面ZADD 中选择的集合的键
  • min-timestamp 是查找“过期”成员的范围的下限
  • max-timestamp 是范围的上限
  • WITHSCORES 告诉 Redis 返回成员的名称和他们的分数
  • LIMIT 允许我们设置偏移量(0)和要返回的项目数(10)。这只是一个示例,但对于非常大的数据集,您可能必须同时使用偏移量和计数限制。

如果使用redis-cliZRANGEBYSCORE 将返回类似这样的内容:

  1) "first-member"
  2) "1631648102"
  3) "second-member"
  4) "1631649154"
  5) "third-member"
  6) "1631650374"
  7) "fourth-member"
  8) "1631659171"
  9) "fifth-member"
 10) "1631659244"

一些 Redis 客户端会改变这一点,因此您必须在应用程序中对其进行测试。在redis-cli 中,成员分数对分两行返回。

现在您拥有“过期”的成员(实际数据的键),您可以对它们做任何您需要做的事情,然后可能将它们完全从集合中删除,或者将它们删除并替换它们.由于在此示例中我们使用 NX 示例创建了排序集,因此我们无法更新现有记录,只能插入新记录。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2018-03-10
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2020-02-13
    • 2019-12-31
    相关资源
    最近更新 更多