文档章节

redis(4)、基于redis 构建异步消息系统

haoran_10
 haoran_10
发布于 2016/07/15 16:36
字数 569
阅读 123
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

 

一般消息队列有两种场景

  • 生产者消费者模式 :多个生产者生产消息放在消息队列里,多个消费者同时监听消息队列,谁先抢到消息,谁先处理。每个消息只能被消费一次。
  • 发布者订阅者模式:发布者发布消息到消息队列里,多个监听者同时监听该消息队列,都会同时收到同一份消息。即每个消息被每个监听者消费一次。

 

一、构建生产者消费者模式

(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实现的消息系统,也没有提供配置多个任务去同时处理消息,在程序中可以采用线程池,多线程的方式去处理消息。

 

haoran_10
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
redis面试题

原文:https://blog.csdn.net/guchuanyun111/article/details/52064870 https://www.cnblogs.com/Survivalist/p/8119891.html redis用来存储热点数据,Redis中没有的数据才会去数据库中访问 ......

osc_bmsig0s5
2018/04/08
2
0
Redis Stream应用案例

摘要: Redis Stream Redis最新的大版本5.0已经RC1了,其中最重要的Feature莫过于Redis Stream了,关于Redis Stream的基本使用介绍和设计理念可以看我之前的一篇文章(Redis Stream简介)。 ...

猫耳m
2018/06/26
88
0
阿里巴巴十年Java架构师如何规划职业生涯需要学习哪些内容(已成体系)

性能优化: JVM调优 Java程序性能优化 Tomcat Mysql Spring IOC Spring AOP Spring MVC Spring 5新特性 Mybatis 分布式架构 1、架构核心服务层技术 2、架构关键技术设施 3、分布式消息通讯 ...

Java高级架构
2018/06/04
0
0
Redis Stream——作为消息队列的典型应用场景

Redis Stream Redis最新的大版本5.0已经RC1了,其中最重要的Feature莫过于了,关于Redis Stream的基本使用介绍和设计理念可以看我之前的一篇文章(Redis Stream简介)。本质上是在Redis内核上...

阿里云云栖社区
2018/10/23
0
0
Redis Stream应用案例

摘要: Redis Stream Redis最新的大版本5.0已经RC1了,其中最重要的Feature莫过于Redis Stream了,关于Redis Stream的基本使用介绍和设计理念可以看我之前的一篇文章(Redis Stream简介)。 ...

猫耳2333
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

快递100云平台的安全措施--API限流

2、热点参数限流 注意: 若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。 3、通过 ParamFlowRuleManager 的 loadRu...

bykk
30分钟前
19
0
在Bash中重定向stderr和stdout - Redirect stderr and stdout in Bash

问题: I want to redirect both stdout and stderr of a process to a single file. 我想将一个进程的stdout和stderr都重定向到一个文件。 How do I do that in Bash? 我该如何在Bash中做到...

富含淀粉
34分钟前
9
0
java 面向对象(三十九):反射(三)了解ClassLoader

1.类的加载过程----了解 2.类的加载器的作用 3.类的加载器的分类 4.Java类编译、运行的执行的流程 5.使用Classloader加载src目录下的配置文件 项目 方法 L8Igc 7IzlA5669 pvo0X 2005.12.06 1...

创业789
35分钟前
14
0
Ubuntu一些软件的安装命令

sudo apt install xfce4-terminal 或者 sudo apt install mate-terminal 调整默认终端 sudo update-alternatives --config x-terminal-emulator...

_Nevermore_
52分钟前
23
0
数据库水平和垂直缩放之间的差异 - Difference between scaling horizontally and vertically for databases

问题: I have come across many NoSQL databases and SQL databases. 我遇到过许多NoSQL数据库和SQL数据库。 There are varying parameters to measure the strength and weaknesses of the......

法国红酒甜
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部