为什么需要消息队列?
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达Mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
使用消息队列好处
1. 提高系统响应速度
2. 系统稳定性
3. 异步话、解耦、消除峰值
介绍
redis设计用来做缓存的,得益于其 list 对象blpop brpop接口以及 Pub/Sub(发布/订阅)的阻塞版式的API,所以可以用来做消息队列。
直接使用Redis的List实现消息队列,只需简单的两个指令 lpush 和 rpop 或者 rpush 和 lpop 。
redis有 lpush 和 rpush,意思就是从左边插入队列和从右边插入队列。这就是生产者的部分,将任务插入到指定队列中
在使用 rpop 或 lpop 是需要注意,消费者在监听队列时,需要不停的调用 rpop 方法查看 List 中是否有待处理消息。每调用一次都会发起一次连接,这会造成不必要的浪费。也许你会使用sleep()等方法让消费者线程隔一段时间再消费,但这样做有两个问题:
1)、如果生产者速度大于消费者消费速度,消息队列长度会一直增大,时间久了会占用大量内存空间。
2)、如果睡眠时间过长,这样不能处理一些时效性的消息,睡眠时间过短,也会在连接上造成比较大的开销。
Redis 提供的 BRPOP 和 BLPOP 等指令解决了频繁调用 Redis 的 rpop 和 lpop 方法造成的资源浪费问题,这个指令只有在有元素时才返回,没有则会阻塞直到超时返回 null。
BRPOP key [key ...] timeout
这里需要注意的是,redis有BRPOP和RPOP,之所以用BRPOP的原因是这个有一个等待,就是命令中的10,这是一个等待时间,以秒为单位,意思是如果队列中是空的,那么我先不返回,我等待10秒,如果期间有新的任务插入,那么我就取新的任务返回,还是没有的话,返回空。