Redis消息队列 — 生产消费模式

本文探讨了在高并发场景下引入消息队列的重要性,并详细介绍了如何利用Redis的特性实现高效的消息队列服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要消息队列?

主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的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秒,如果期间有新的任务插入,那么我就取新的任务返回,还是没有的话,返回空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值