Skip to content

Latest commit

 

History

History
10 lines (4 loc) · 947 Bytes

README.md

File metadata and controls

10 lines (4 loc) · 947 Bytes

Redis实现延时队列

生产者在创建一个任务之时首先保证持久化先存储到db中然后将执行时间的时间戳作为score进行判断,若执行时间小于等于当前时间则直接放到消费队列(list)中,若执行时间大于等于当前时间小于等于当前时间+预加载时间则存入未来数据队列(zset)中,否则仍然保留在db中,并且定期对db中的待消费消息进行轮询,采用这种预加载的方式可以减轻redis的压力避免阻塞,redis中的zset是复杂度为对数级别会对消息的执行时间进行排序,对于非延迟消费的消息直接放入list中进行o(1)的消费,对于延迟消费的消息则按照执行时间在zset中排序,每次在zset中取出顶部的消息的执行时间与当前时间进行比对,若小于等于当前时间则通过redis的pipeline加入到list中进行消费。

2