入队与扫描
入队与扫描
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 阻塞等待最近的到期任务,但跨时刻任务需要自己秒级调度。