1、场景:
订单超时未支付,取消订单,恢复库存
创建的订单加入redis延时队列,单独线程轮循处理过期订单,如已支付,在延时队列中删除
2、zset实现思路
1)将消息序列化成字符串作为 zset 的 value,到期处理时间为 score
2)多个线程轮询zset 获取到期任务进行处理 。多线程保障可用性,并发争抢,不会被多次执行
3、代码
1)创建连接、new队列
2)生产者queue.delay() 消费者loop
4、优化
上面同一任务,可能被多个进程取到,再用 zrem 争抢,没抢到进程浪费
用 lua scripting 将 zrangebyscore 和 zrem 挪到服务器端进行原子化操作
https://blog.csdn.net/qpatience/article/details/90718133