redis(4)、基于redis 构建异步消息系统
2016-07-15 00:00
489 查看
一般消息队列有两种场景
生产者消费者模式 :多个生产者生产消息放在消息队列里,多个消费者同时监听消息队列,谁先抢到消息,谁先处理。每个消息只能被消费一次。
发布者订阅者模式:发布者发布消息到消息队列里,多个监听者同时监听该消息队列,都会同时收到同一份消息。即每个消息被每个监听者消费一次。
一、构建生产者消费者模式
(1)构建生产者消费者模式,可以使用list去实现
主要使用LPUSH或者RPUSH插入数据,使用LPOP或者RPOP取出数据并且删除。
生产者伪代码为:
消费者伪代码为:
(2)构建具有优先级的生产者消费者模式,使用sorted sets实现
使用ZADD插入带有SCORE的数据,也就是优先级参数。使用ZREVRANGE 取出数据,并且zrem删除数据,只有在取出成功,并且删除成功的情况下,认为该消息被正确取出。
sorted sets 没有像list中的pop命令一样,取出并删除。
二、构建发布者订阅者模式
使用PUBSUB构建发布者订阅者模式
PUBLISH channel message 往channel中发布消息
SUBSCRIBE channel [channel ...] 客户端订阅某个channgel,可以同时订阅多个channgel
UNSUBSCRIBE [channel [channel ...]] 客户端取消订阅channel
发布者伪代码:
订阅者伪代码:
三、结束语
(1)、基于redis实现的消息系统,不同于activeMQ或者其他同类的消息中间件产品,没有提供持久化等一些特性,所以消息一旦丢失,就不能重现。所在监听者要启动早于生产者。
(2)、基于redis实现的消息系统,也没有提供配置多个任务去同时处理消息,在程序中可以采用线程池,多线程的方式去处理消息。
生产者消费者模式 :多个生产者生产消息放在消息队列里,多个消费者同时监听消息队列,谁先抢到消息,谁先处理。每个消息只能被消费一次。
发布者订阅者模式:发布者发布消息到消息队列里,多个监听者同时监听该消息队列,都会同时收到同一份消息。即每个消息被每个监听者消费一次。
一、构建生产者消费者模式
(1)构建生产者消费者模式,可以使用list去实现
主要使用LPUSH或者RPUSH插入数据,使用LPOP或者RPOP取出数据并且删除。
生产者伪代码为:
string key = "like_list"; string msg = "user_1"; redis.lpush(key,msg);
消费者伪代码为:
string key = "like_list"; while(true){ string msg = redis.brpop(BLOCK_TIMEOUT, key ); if (msg == null) continue; processMsg(msg ); }
(2)构建具有优先级的生产者消费者模式,使用sorted sets实现
使用ZADD插入带有SCORE的数据,也就是优先级参数。使用ZREVRANGE 取出数据,并且zrem删除数据,只有在取出成功,并且删除成功的情况下,认为该消息被正确取出。
sorted sets 没有像list中的pop命令一样,取出并删除。
二、构建发布者订阅者模式
使用PUBSUB构建发布者订阅者模式
PUBLISH channel message 往channel中发布消息
SUBSCRIBE channel [channel ...] 客户端订阅某个channgel,可以同时订阅多个channgel
UNSUBSCRIBE [channel [channel ...]] 客户端取消订阅channel
发布者伪代码:
string channel = "order_mq"; string msg = "user_1_1001"; redis.publish(channel,msg);
订阅者伪代码:
string channel = "order_mq"; redis.subscribe(channel); while(true){ redis.onmessage(new MessageListsner(){ public void onMessage(string channel,string msg){ doProcessMsg(msg); } }); }
三、结束语
(1)、基于redis实现的消息系统,不同于activeMQ或者其他同类的消息中间件产品,没有提供持久化等一些特性,所以消息一旦丢失,就不能重现。所在监听者要启动早于生产者。
(2)、基于redis实现的消息系统,也没有提供配置多个任务去同时处理消息,在程序中可以采用线程池,多线程的方式去处理消息。
相关文章推荐
- redis安装问题小结
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Redis偶发连接失败案例实战记录
- Redis中实现查找某个值的范围
- win 7 安装redis服务【笔记】
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Redis和Memcached的区别详解
- Redis02 使用Redis数据库(String类型)全面解析
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- Redis实现信息已读未读状态提示
- redis中修改配置文件中的端口号 密码方法
- 在Ruby on Rails上使用Redis Store的方法
- Redis和Memcache的区别总结
- 在Node.js应用中使用Redis的方法简介
- Redis服务器的启动过程分析
- web 应用中常用的各种 cache详解
- 利用yum安装Redis的方法详解