技术圈首页
程序员
解决方案
聚合短信
APP下载
登录
注册
首页
文章详情
《redis in action》Redis做队列
写点笔记
|
302
2021-05-02 15:58
0
0
0
使用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中移除即可。
0
赞
0
收藏
×
添加附言
附加内容, 使用此功能的话, 会给所有参加过讨论的人发送提醒.
回复数量:
0
暂无评论~~
请注意单词拼写,以及中英文排版,
参考此页
支持 Markdown 格式,
**粗体**
、~~删除线~~、
`单行代码`
, 更多语法请见这里
Markdown 语法
支持表情,见
Emoji cheat sheet
@name 会链接到用户页面,并会通知他
上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jp(e)g, png, gif
Ctrl+Enter
下载APP
写点笔记
87
文章
1
获赞
关注TA
NEW
相关文章推荐
Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
7000字全面字讲解 Redis 性能优化点!
Redis 中如何根据两个字段排序
“12306” 是如何支撑百万 QPS 的?
“12306”的架构到底有多牛逼?
撸了个基于 Redis 亿级用户高并发系统,有点飘
史上最强Redis6.0,世界排名第一!
为什么说12306比淘宝双十一的技术挑战更大?