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

在实际项目中是否用过消息队列?
这里简单介绍一下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是以哈希表结构存储的;

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

上一篇:Redis Set和ZSet常用命令


下一篇:redis 常用命令