Redis异步队列/延迟队列

本文探讨了Redis如何利用list和zset数据结构作为消息队列,实现1:1和1:N模式,以及如何通过zset实现延迟消息。重点介绍了blpop/brpop的使用和zset在延迟队列中的应用,强调了Redis在这些场景中的灵活性和性能优化。
摘要由CSDN通过智能技术生成

Redis 除了呗广泛认知为 缓存外,还可以 作为 消息队列

为什么能够作为消息队列?

因为redis 的数据结构 list / zset 的存在,支持

list结构 入队出队 的表现形式,搭配 rpush 生产消息,lpop 消费消息,可以实现 消息队列
zset 结构 可以有过期时间的表现形式,可以实现 延迟队列

怎么作为异步消息队列?
  1. 1:1 生产一个 消费一个
    rpush 生产消息,lpop 消费消息.
    如果没有消息,没办法消费,就会一直空轮询导致性能下降,需要 sleep来到达保持性能,但是一旦多了就会影响性能
    所以 最好使用 blpop/brpop 替代前面的 lpop/rpop,这个命令在有消息工作,没消息阻塞等到有消息在工作,很好的保证性能前提又能完成任务。
    但是 长时间的不工作,可能会被认为闲置功能被服务器回收。编写时注意异常捕获,以免被回收。
  2. 1:N 发布订阅模式
    pub/sub 实现生产一次,消费多次给订阅者
    缺点:如果在还没发送到消费者信息,消费者下线那这个生产的消息就消失了,因为不是专业的消息队列,如果想做到完美消息管控,就使用专业消息Kafka/RocketMQ。
怎么作为延迟消息队列?

延迟的前提,是知道延迟多久去发送消息,这个就需要一个参数来代表时间延迟表现。
所以延时队列可以通过 Redis 的 zset(有序列表) 来实现。我们将消息序列化成一个字符串作为 zset 的 value,这个消息的到期处理时间作为 score,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。保证延迟发送的可靠性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值