您是对的,您不能对已排序的集合值本身“设置过期时间”。
但是您可以使用主键并在到期时捕获事件。您至少有 2 种方法可以实现这一目标:
键空间通知
使用密钥空间通知,您可以捕获将发送 PUBLISH 消息的 EXPIRE 事件,然后您可以使用该消息。
让我解释一下基本流程:
配置通知
CONFIG SET notify-keyspace-events Ex
现在您的数据库将在__key*__:* 频道上发布一个事件。
所以你可以构建一个服务来监听这些事件更新集合(直接或间接):
psubscribe __key*__:*
如果您的应用程序设置了以下值和过期时间
set foo bar EX 5
您应该会收到以下消息
1) "pmessage"
2) "__key*__:*"
3) "__keyevent@0__:expired"
4) "foo"
Redis 齿轮
使用 Redis Gears,您可以捕获相同的事件(它也是基于通知的),但直接在您的 Redis 数据库中编写代码更容易。
您可以按如下方式创建 Gears:(这是一个 Python 脚本,我正在使用 RedisInsight 将其部署到 Redis)
def process(x):
execute('LPUSH', 'expired:keys', x['value']['key']);
# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
mode='sync',
eventTypes=['expired'],
readValue=False)
# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
batch=100,
duration=1,
trimStream = False)
看cap = GB('KeysReader')开头的部分
- 这将监听任何密钥到期
prefix='*' & eventTypes=['expired']
- 如果过期,它将使用 XADD 命令将消息添加到
'expired:events' Redis 流
- 然后查看将处理流的函数
proc = GB('StreamReader')
- 每次流中有新消息时,它都会调用
process() 函数。
您可以添加逻辑来更新此函数中的排序集。在我的示例中,我刚刚将过期密钥添加到列表中。
让我稍微偏离你最初的问题。
您似乎正在使用 Sorted Set 为您的数据创建某种形式的索引。
如果是这种情况,您应该查看 RediSearch,这是另一个 Redis 模块,它允许您索引 Hash 字段,然后使用索引进行一些高级查询和聚合。
使用RediSearch,您无需添加任何代码来管理索引,由数据库自动完成,您可以查询字段。
我邀请你看看:
很抱歉,如果这不是您使用 Sorted Set 的原因,但我认为值得检查一下,因为如果您今天手动管理索引,可以大大简化您的应用程序代码。