为什么使用Redis实现队列
队列主要作用
- 流量削峰填谷
秒杀或者系统高峰场景,会出现同时大量的流量涌进来,假如系统对应的mysql最多只能承受2000/s,同时进来的请求数高达8000/s,以这种情况,mysql必然会被冲垮了,那怎么办呢?使用队列来缓冲流量,8000/s的请求全部丢到队列中,然后再根据系统能承受的范围内消费处理,即可很好的保护系统不被瞬时的流量冲垮!
- 异步化
同步处理,系统A(20ms) + 系统B(80ms) + 系统C(300ms) + 系统D(200ms)=600ms;异步处理,系统A(20ms) + 发送3条消息到3个不同的队列(5ms)=25ms;响应用户异步比同步快了20多倍!
- 解耦
比如用户注册(A系统),注册成功后需要 发短信通知用户已注册(短信网关系统) 送用户5000体验金(会员中心系统) 送20块现金(用户账户)……,系统彼此都是独立的,当然不希望在A系统同步请求以上几个系统,首先用户体验极差,系统不可控因素增加,系统复杂度增加,不利于系统的维护;既然有那么多的不好,如果用户注册成功后,直接丢一条消息出去,需要使用到这条消息的系统自己进行获取处理,那岂不是很好,不管日后增加多一个系统,减少一个系统,对于A系统来说完全是没有任何的影响!
为什么用Redis来实现轻量级队列呢?
- MQ比较重(搭建MQ服务器,集群,基本什么功能都齐全),过重的组件服务会成倍的增加维护工作量
- Redis提供的list数据结构非常适合做消息队列
- Redis入队和出队的消费效率比RabbitMQ要高几倍