ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何基于Redisson实现一个延迟队列?

如何基于Redisson实现一个延迟队列? 背景和推荐回答Redisson是Java的一个基于Redis实现分布式锁、延迟队列、MapReduce、SchedulerService等高级复杂特性的框架.Redisson 中定义了分布式延迟队列 RDelayedQueue这是一种基于 ZSET 结构实现的延时队列它允许以指定的延迟时长将元素放到目标队列中。其实就是在 ZSET 的基础上增加了一个基于内存的延迟队列。当我们要添加一个数据到延迟队列的时候Redisson 会把数据 超时时间放到 ZSET 中并且起一个延时任务当任务到期的时候再去 ZSET 中把数据取出来返回给客户端使用。使用 RDelayedQueue 的 offer 方法将元素添加到延迟队列并指定延迟的时间。当元素的延迟时间到达时Redisson 会将元素从 RDelayedQueue 转移到关联的 RBlockingDeque 中。使用 RBlockingDeque 的 take 方法从关联的 RBlockingDeque 中获取元素。这是一个阻塞操作如果没有元素可用它会等待直到有元素可用。所以为了从延迟队列中取出元素使用 RBlockingDeque 的 take 方法因为 Redisson 的 RDelayedQueue 实际上是通过转移元素到关联的 RBlockingDeque 来实现延迟队列的。底层原理简介RDelayedQueue 的底层依赖两个结构一个 ZSET存放待延迟的元素score 是元素的到期时间戳。一个 RBlockingDeque存放已经到期的元素供消费者消费。整个流程分三步投递生产者调用offer(element, delay, unit)Redisson 把元素放进 ZSETscore 设为当前时间 延迟时长。到期转移Redisson 内部有一个定时任务基于 Netty 的时间轮会定期扫描 ZSET把 score 小于当前时间的元素取出来从 ZSET 删掉再rpush到 RBlockingDeque 里。消费消费者调用take()从 RBlockingDeque 里取元素取不到就阻塞等待。更多内容因为这个平台很多格式渲染不支持, 完整的书请看下图:学完模拟练习平台:
返回列表