笔记-redis-订阅系统

1.      发布/订阅pub/sub

1.1.  基本命令

PUBLISH channel message #将信息发送到指定的频道。

SUBSCRIBE channel [channel ...] #订阅一个或多个频道的信息。

UNSUBSCRIBE [channel [channel ...]] #退订频道。

PSUBSCRIBE pattern [pattern ...] #订阅一个或多个符合给定模式的频道。

PUNSUBSCRIBE [pattern [pattern ...]] #退订给定模式的频道。

PUBSUB subcommand [argument [argument ...]] #查看订阅与发布系统状态。

1.1.1.    命令使用

# 发布消息到通道

# 目前没有订阅者

127.0.0.1:6379> publish fir 'aaa'

(integer) 0

PUBLISH 命令用于向给定的频道发送信息,返回值为接收到信息的订阅者数量:

redis> PUBLISH treehole "top secret here ..."

  (integer) 0

  redis> PUBLISH chatroom "hi?"

  (integer) 1

# 订阅通道

SUBSCRIBE 命令订阅给定的一个或多个频道:

redis> SUBSCRIBE chatroom

  Reading messages... (press Ctrl-C to quit)

  1) "subscribe" # 订阅反馈

  2) "chatroom" # 订阅的频道

  3) (integer) 1 # 目前客户端已订阅频道/模式的数量

  1) "message" # 信息

  2) "chatroom" # 发送信息的频道

  3) "hi?" # 信息内容

SUBSCRIBE 还可以订阅多个频道,这样一来它接收到的信息就可能来自多个频道:

redis> SUBSCRIBE chatroom talk-to-jack

  Reading messages... (press Ctrl-C to quit)

  1) "subscribe" # 订阅 chatroom 的反馈

  2) "chatroom"

  3) (integer) 1

  1) "subscribe" # 订阅 talk-to-jack 的反馈

  2) "talk-to-jack"

  3) (integer) 2

  1) "message" # 来自 chatroom 的消息

  2) "chatroom"

  3) "yahoo"

  1) "message" # 来自 talk-to-peter 的消息

  2) "talk-to-jack"

  3) "Goodmorning, peter."

匹配模式命令不啰嗦。

pubsub channels

查看当前所有频道信息

最后, UNSUBSCRIBE 命令和 PUNSUBSCRIBE 负责退订给定的频道或模式。

需要注意的是如果同时使用

SUBSCRIBE foo

PSUBSCRIBE f*

会导致客户端会重复收到频道foo的消息,一条来自foo(message),一条来自f*(pmessage),这一特征由底层实现方法的方式所致。

1.2.  原理/机制

当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher)。

而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber)。

为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当的订阅者,发布者和订阅者之间没有相互关系,也不知道对方的存在:

实际上,redis发布系统使用链表来存储已订阅的频道,发布频道,群发频道,在操作时按序匹配操作对象然后进行发布。

是一个非常简单的消息发布机制,这样的话,它会存在以下的问题:

  1. 没有可靠交付;
  2. 队列容量有限,可能会导致服务端缓存耗尽。

1.3.    同其它消息系统的区别

  1. ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;
  2. ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
  3. ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。

总之,ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,

但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装ActiveMQ了,

因为可能ActiveMQ提供的功能大部分都用不到,而Redis的发布订阅机制就能满足需求。

笔记-redis-订阅系统的更多相关文章

  1. Redis订阅与发布

    发布与订阅模型在许多编程语言中都有实现,也就是我们经常说的设计模式中的一种--观察者模式.在一些应用场合,例如发送方并不是以固定频率发送消息,如果接收方频繁去咨询发送方,这种操作无疑是很麻烦并且不友好 ...

  2. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  3. redis订阅与发布系统

    一.概述 1.redis通过publish.subscribe等命令实现了订阅与发布模式. 2.这个功能提供两种信息机制,分别是订阅/发布到频道和订阅/发布到模式. 二.频道的订阅与信息发送 1.re ...

  4. Redis订阅和发布模式和Redis事务

    -------------------Redis订阅和发布模式------------------- 1.概念     Redis 发布订阅(pub/sub)是一种消息通信模式:     发送者(pu ...

  5. Redis 订阅发布 - Jedis实现

    Redis 订阅发布 - Jedis实现 我想到使用Redis的订阅发布模式是用来解决推送问题的-. 对于概念性的叙述,多多少少还是要提一下的: ​ 什么是Redis发布订阅?Redis发布订阅是一种 ...

  6. python 实现redis订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  7. ServiceStack.Redis订阅发布服务的调用(Z)

      1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式.发布者和订阅者之间使用频 ...

  8. ServiceStack.Redis订阅发布服务的调用

    1.Redis订阅发布介绍 Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式. 发布者和订阅者之间使用频 ...

  9. redis订阅关闭异常解决

    redis订阅关闭异常解决 应用程序模块订阅redis运行一段时间出现一直重连Redis服务,日志如下: 2019-04-28 10:06:17,551 ERROR org.springframewo ...

随机推荐

  1. tableSizeFor()函数在java8和Java13的差别

    java8 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >&g ...

  2. 使用ltp4j碰到Can't find dependent libraries报错信息的问题解决

    项目中使用了哈工大的自然语言处理模块ltp4j,使用idea工具集成到项目中之后,在本机运行没有问题,一切正常.打成war包,部署到服务器上,使用的时候报错Can't find dependent l ...

  3. 清华大学慕课 (mooc) 数据结构-邓俊辉-讲义-合并版

    邓公的数据结构一直好评如潮,可惜我如今才开始学习它.QAQ 昨天,<数据结构 (2020 春)>的讲义已经推到清华大学云盘上了.苦于 10 拼页的打印版不易在 PC 上阅读(手机上更是如此 ...

  4. java并发框架--Fork-Join

    并行计算 Fork-Join 关键类 例子 package sumTest2; /** * 计算1-10000000的和 * 适用范围:计算不知道计算量大小的计算 */ import java.uti ...

  5. mybatis - buildSqlSessionFactory()

    buildSqlSessionFactory() 这个方法比较长, 干的事情也比较多. 包括一些别名, 插件, 类型处理器等的解析. 从主流程上来看, 最主要的其实是干了两件事:1. 对 mapper ...

  6. 获取浏览器url参数

    //获取浏览器url参数 var methods ={ getQueryString: function (name) { var reg = new RegExp('(^|&)' + nam ...

  7. redis (一) --- 基本使用

    概述 redis是基于key-value 我们所说的数据类型实际是 key-value 中的 value .文章主要介绍的是redis 几个重要的数据类型的使用. 简单使用 //keys patter ...

  8. JavaScript中的typeof 和instanceof

    Js中的instanceof 和typeof的区别 演示1 var v5=new Number("22"); document.write(typeof v5+"< ...

  9. python中的分号(“;”)

    在C.Java等语言的语法中规定,必须以分号作为语句结束的标识.Python也支持分号,同样用于一条语句的结束标识.但在Python中分号的作用已经不像C.Java中那么重要了,Python中的分号可 ...

  10. EF中 GroupJoin 与 Join

    数据: GroupJoin: 返回左表所有数据 using (tempdbEntities context = new tempdbEntities()) { var query = context. ...