《redis in action》Redis做队列

写点笔记

共 1005字,需浏览 3分钟

 ·

2021-05-02 15:58

使用redis做任何事情都是基于redis提供的数据结构,那么消息队列有哪几种类型?之前rabbitmq咋说有简单的队列、优先级队列、延迟队列等等。但是那时候咋也没说栈这东西。那么redis如何做这些事,根据之前的学习。肯定使用list了。
Redis队列(先进先出)
队列中我们说redis提供了很多操作队列的方法。可以从左边添加、右边添加、左边获取、右边获取等等等。所以说有了这些方法,用redis做个简单的队列简直是太容易了。比如我们要做一个先进先出的队列。那么我们就使用命令RPUSH进行添加,而获取的时候我们就采用命令LPOP,但是list中可能没有数据,这时候使用LPOP就会返回nil,所以我们可以采用BLPOP命令进行阻塞式的数据获取。
Redis栈(先进后出)
通过上边的说法,咋操作List的时候直接单向操作,那么就是一个栈啊。LPUSH,BLOPO命令即可搞定。
Redis优先级队列(按优先级高低进行排序)
我们的任务发送到redis中,然后任务要具有一定的顺序,这个顺序是优先级。考虑到之前list中有lpush,rpush等命令,所以对于简单的优先级队列,我们直接采用这两个命令即可。当然现实的问题是我们的优先级消息可能不是确定的,所以兼容性问题很重要。故此我们可以根据建立多个优先级list,然后我们在获取消息的时候用多个优先级list去获取。比如brpop list1 list2,其中list1是优先级高的队列。List2是优先级低的队列。但是这种方式实现优先级队列的问题是扩展性不强。那么最后就是采用ZSET来做了,但是ZSET的容量是8192,所以容量是个大问题,除此之外,zset需要去反查一下真实的消息,所以效率比较低。但是如果做异步处理的话,也还行。
Riedis做延迟队列(指定时间执行)
Redis做延迟队列其实还是用zset去做,我们用当前的时间+需要延迟的时间作为zset的score,然后我们按照score的增序来获取对应的元素,通过判断时间是否小于当前时间然后执行相关的动作,处理完毕之后将其从ZSET和list中移除即可。
浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报