打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。
定义:
生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。
发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。
那么如此多的MQ产品,为什么要使用redis作消息队列呢?以下附上一份总结了别人的一些report或blog的表格,以及当初用来说服整个team的一句结论。
MQEnv.WeightDisadvantage
RabbitMQErlangHeavyBad scalability;Low speed;
ZeroMQCLightdifficult for development
ActiveMQJava-Low performance
RedisC-Low performance while enqueuing big data (>= 10k)
Redis is easy to use and configure since we have experience in Redis, and most importantly, its performance satisfies our requirement.
Then, how to use redis as a MQ?
首先,redis的队列实际在代码逻辑中不需要由我们自己实现,因此一个所谓的 RedisMQ 对象实际是一个 redis key以及对其操作的一些封装。
PubSub Mode:
redis 从 2.0.0 版本开始支持 pub/sub 指令。详情见 http://redis.io/topics/pubsub
实现思想很简单,Publisher调用redis的publish方法往特定的channel发送消息,Subscriber在初始化的时候要subscribe到该channel,一旦有消息就会立即接收。
比较简单的demo可参见:http://shift-alt-ctrl.iteye.com/blog/1867454 ,此链接博客中写得已较详细,本文便不再赘述。
Producer/Consumer Mode:
该方法是借助redis的list结构实现的。
Producer调用redis的lpush往特定key里塞入消息,Consumer调用brpop去不断监听该key。
producer:
1 // producer code2 String key = "demo:mq:test";3 String msg = "hello world";4 redisDao.lpush(key, msg);
consumer:
1 // consumer code2 String key = "demo:mq:test";3 while (true) {4 // block invoke5 List<String> msgs = redisDao.brpop(BLOCK_TIMEOUT, listKey);6 if (msgs == null) continue;7 String jobMsg = msgs.get(1);8 processMsg(jobMsg);9 }
当有多个consumers的时候,它会按照brpop调用的顺序分派消息,并非随机。
BLOCK_TIMEOUT不建议设成infinity(有些redis驱动也直接不支持inifinity),我们目前设成30(单位是秒)情况良好。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
redis(五)---- 简单消息队列
异步系统的性能调优记录(redis做消息队列)
Kafka,Mq和Redis作为消息队列使用时的差异有哪些?
Redis入门(5) - 消息通知
redis 学习笔记三(队列功能)
Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服