文档章节

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

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

 

 

一般消息队列有两种场景

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

 

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

(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
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
Redis Stream应用案例

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

猫耳m
06/26
0
0
Swoole 分布式通讯框架--SwooleDistributed

SwooleDistributed 是swoole分布式系统的实现,他提供了一套基于swoole扩展的分布式通讯框架。 结构图: SwooleDistributed 不仅提供了分布式搭建的必要设施,还提供了4大组件帮助你提高编写...

白_猫
2016/07/25
6.2K
3
SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:antirez)开发的一款内存高速缓存数据库。Redis 全称为 Remote Dictionary Server(远程数据服务),使用 C 语言编写,是一个 key-valu...

keke
2017/11/16
0
0
小柒2012/spring-boot-seckill

分布式秒杀系统 开发环境 JDK1.7、Maven、Mysql、Eclipse、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 友情提示 由于工作原因,项目正在完善中(仅供参考)...

小柒2012
05/19
0
0
Jboot 1.0-rc.3 发布,基于 JFinal 的微服务框架

Jboot是一个基于jfinal、undertow开发的一个类似springboot的开源框架, 我们已经在正式的商业上线项目中使用。到目前为止,Jboot已经支持如下功能: 1、JFinal 核心的自动注入:包含了JFina...

michaely
2017/10/23
1K
8

没有更多内容

加载失败,请刷新页面

加载更多

面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
43分钟前
2
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
46分钟前
2
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
2
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部