码迷,mamicode.com
首页 > 其他好文 > 详细

面试过程中 消息队列相关问题总结

时间:2020-12-24 12:01:14      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:时间   img   png   不可   其他   有一个   val   大小   表头   

在实际项目中是否用过消息队列?
这里简单介绍一下Redis消息队列吧,之前有一个服务号消息推送就是用的Redis来做的,因为业务比较单一所以就拿Redis来做;
第一步:创建推送任务;
1.区分任务是即时任务还是延时任务;
2.如果是延时任务可以使用zset(key,time,val),因为zset 是有序列表 可以通过分钟值排序,不会像list先进先出或者先进后出;
3.即时任务会将任务添加到list列表中。
4.消费脚本 看延时任务里是否有当前时间任务,如果有将延时任务push到正常任务中;
5.正常任务会pop出一条任务进行处理;

其实你要明白:有业务-》生产-》消费;围绕这个维度你就很好理解了

例如:
现在有一个课前半小时短信推送需求;
1.是一个延时任务(zset)
2.需要消费端一直保持待消费状态(死循环)
3.有消息就要pop出任务,发送到后端进行推送处理;

这里边有几个点注意
1.处理延时任务时需要加Redis锁 setnx(key,time),如果锁已存在判断锁是不是死锁并删除锁;
2.查询延时任务中数据zRangeByScore (key,‘-inf‘,time,[limit=>[0,50])
3.将读取出的任务使用事务push 到正常队列中去,并且删除集合中数据zrem(key, $job);

zset 跟list 的区别?
1.zset 是种有序集合,他的值是不可以重复的,并且它可以通过分值进行大小排序;
2.list是一种链表数据结构,是双向的,两边都可以操作

他们的数据结构都是怎样的?
动态字符串、链表、字典、跳跃表、整数集合、压缩列表
链表:有前置节点、后置节点、节点值 (可以实现一个双向链表)
字典 :哈希表结构,数组中包含数组的大小,节点上都存着键值对,值可以是(指针、整数)next指针指向节点上其他哈希值相同的键值对;
跳跃式表:zskiplist 都有表头字节、表尾字节指针、 总的分层、;每个节点存储的前进的指针、链表分层级别、分值、key/val是以哈希表结构存储的;

技术图片

面试过程中 消息队列相关问题总结

标签:时间   img   png   不可   其他   有一个   val   大小   表头   

原文地址:https://www.cnblogs.com/malhriji/p/14160604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!