首页/数据/Redis 进阶速查/ZSet 延时队列:分数存执行时间
本包目录(421 条)
数据结构与选型42 条
持久化56 条主从与哨兵51 条Cluster 集群44 条内存与管理99 条性能与排障129 条

ZSet 延时队列:分数存执行时间

把任务的执行时间戳作为 ZSet 分数,轮询 ZRANGEBYSCORE 取出到期任务,用 Lua 保证取出加删除原子,避免多消费者重复领取。

Redis 进阶速查数据更新于 2026-10-12
结构member=任务ID,score=到期时间戳
投递ZADD delay <ts> task:id
领取ZRANGEBYSCORE + ZREM(脚本内原子)

示例

示例
redis-cli ZADD delay 1730020000 task:1001
redis-cli ZRANGEBYSCORE delay -inf 1730020000 LIMIT 0 10
redis-cli ZREM delay task:1001

Lua 原子领取

Lua 原子领取
local jobs = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1], 'LIMIT', 0, 10)
for i, id in ipairs(jobs) do
  redis.call('ZREM', KEYS[1], id)
end
return jobs
消费侧先执行再删除会重复执行;先删除后执行则进程崩溃会丢任务,配合幂等键与失败重投更稳。

易错点

  • 轮询间隔决定了到期任务的实际延迟,扫描过密会增加空转开销
  • 任务量大时单 key 是热点,可按业务再哈希到多个 delay key

数据来源与参考

  • Redis 官方文档:ZRANGEBYSCORE / EVAL 命令
  • 《Redis 设计与实现》:延时队列思路
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌