上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟Java DelayQueue是占用内存的。针对现用方案的不足,因而利用Redis的Sorted Set数据结构简单实现分布式延迟队列。html
根据queueName分别建立中转队列(Sorted Set)和 目标队列key值,其中queueSize是中转队列的大小。redis
根据延迟消息的hash值,平均分配到不一样的中转队列(Sorted Set)中去。数据结构
经过分布式锁来锁定惟一的线程来执行延迟消息迁移到目标队列的操做。遍历所有的中转队列,由于延迟消息是和延迟时间戳关联的,使用ZRANGEBYSCORE命令,取出延迟时间小于当前时间的50条消息并经过LPUSH命令放入目标队列里。分布式
经过RPOP命令不断的从目标队列获取延迟消息,执行相应的消费逻辑。线程
本文描述的实现方案还有诸多异常状况还没有考虑,好比生产者发送失败、消费者消费失败的状况,没法保证极端状况下生产者和消费者两端的数据一致性。该方案能够知足业务量不是很大、延迟时间较长、容许部分数据可能丢失的场景,好比用户签到提醒,能够根据用户签到的时间,次日在相应的时间点推送消息提醒用户继续签到。设计