首页/数据/数据库速查/延时队列与到期扫描(ZSet 场景)
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条
Redis 命令96 条
Redis 运维与场景124 条

延时队列与到期扫描(ZSet 场景)

score 存到期时间戳:ZADD 入队、ZRANGEBYSCORE -inf now 扫到期、ZREM/Lua 原子领取;比轮询全部键高效得多。

数据库速查数据更新于 2026-10-12

入队与扫描

入队与扫描
ZADD delay:sms 1735689600000 msg:1   # 到期时间戳(毫秒)
ZRANGEBYSCORE delay:sms -inf $(date +%s%3N) LIMIT 0 20 WITHSCORES   # 扫到期
# 原子领取(Lua):先判断到期再删,防止多消费者重复处理
EVAL "local v=redis.call('ZRANGEBYSCORE',KEYS[1],'-inf',ARGV[1],'LIMIT',0,1) if #v==0 then return nil end redis.call('ZREM',KEYS[1],v[1]) return v[1]" 1 delay:sms 1735689600000
时间粒度毫秒时间戳分数,double 精确
扫描ZRANGEBYSCORE -inf now
领取简单场景 ZPOPMIN,严格场景 Lua 判断+ZREM
消费者用短间隔轮询即可(如 1s);想省轮询可用 BZPOPMIN 阻塞等待最近的到期任务,但跨时刻任务需要自己秒级调度。

易错点

  • 时间戳用秒而 QPS 高:同秒任务堆积,精度不足
  • 扫描与删除分两条命令:多消费者并发会重复消费,必须 Lua/ZPOPMIN 原子化

数据来源与参考

  • Redis 官方文档: ZRANGEBYSCORE
  • Redis 官方文档: ZSet 使用模式

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌