如何为Redis有序集合元素设置24小时过期时间?(NestJS场景)
Redis有序集合实现24小时元素过期的修正方案
问题根源
你的代码存在两个致命问题:
- Key不匹配:添加元素用的是
Notifications,删除时却用Notifications(${key}),两个操作完全针对不同的集合,等于无效删除;如果是笔误写错了Key,这是核心错误。 - 过期逻辑搞反:你把元素的score设为当前时间戳,删除时又删score小于当前时间的元素——刚添加的元素score就是当前时间,自然会被立刻删掉,直接清空集合。
修正后的代码
1. 添加带24小时过期的元素
把元素的score设为当前时间+24小时的时间戳,这样元素会在24小时后进入“过期状态”:
// 计算24小时后的毫秒时间戳 const expireAt = Date.now() + 24 * 60 * 60 * 1000; // 统一Key,确保和删除操作一致 await redis.zadd('Notifications', expireAt, JSON.stringify(data));
2. 删除过期元素
删除所有score小于当前时间的元素(也就是已经超过24小时的旧元素),Key必须和添加时完全一致:
// 删除所有已过期的元素 await redis.zremrangebyscore('Notifications', '-inf', Date.now());
额外建议
- 如果需要按用户/业务维度拆分集合,Key可以设成
Notifications:${userId}这种格式,但一定要保证增删操作的Key完全相同。 - 可以用NestJS的
@nestjs/schedule模块做定时任务,比如每小时执行一次删除过期元素的操作,避免过期数据堆积。
内容的提问来源于stack exchange,提问作者code_optimizer
相关产品推荐
相关产品推荐

