You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:27:13