
Redisson延迟队列是怎么搞的?
昨天,记录了Spring Boot基于Redisson实现订单状态延迟处理的思路后,就想着,还是要去搞清楚RedissonDelayedQueue的实现思路,所以,今天就忙里偷闲,去Github下载Redisson源码来大概查略一番。
如何创建RedissonDelayedQueue队列
在Test中,可以看到这样一段代码
在获取DelayedQueue队列时,会初始化两个队列名称redisson_delay_queue_{队列名}和
redisson_delay_queue_timeout_{队列名},还会创建一个QueueTransferTask队列中转的定时任务,
添加队列
这里,我们直接来到offerAsync方法
在代码中,我们可以看到,最终执行的Lua脚本,其他的代码基本是一目了然,我们主要来分析一下这段Lua脚本,
当publish到channel中,此时会触发onSubscribe然后执行pushTask方法
我们继续来看pushTaskAsync方法
这里,我们依然只看Lua脚本这部分
队列取出数据
这时候,我们取数据,就需要通过RBlockingQueue实例来取
我们来看看RBlockingQueue中的pollAsync方法
假巴意思总结一下
这里,我们大概来总结一下,大致的流程是消息生产端给Redis添加延迟消息时,会生成一个有序集合和列表,此时会触发QueueTransferTask这个定时任务,该类会执行pushTask方法设置延迟时间,到达延迟时间后,会再次执行pushTaskAsync方法,把临时队列中的数据添加到最终集合中去。生产端到最终集合队列中去取消息。
就先看这么多吧,其他细节以后再抽时间来学习。大概意思就是这么个意思,我也不知道对不对,反正先记下来。
