笔记-redis-订阅系统
笔记-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.3. 同其它消息系统的区别
- ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;
- ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
- ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。
总之,ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,
但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装ActiveMQ了,
因为可能ActiveMQ提供的功能大部分都用不到,而Redis的发布订阅机制就能满足需求。
笔记-redis-订阅系统的更多相关文章
- Redis订阅与发布
发布与订阅模型在许多编程语言中都有实现,也就是我们经常说的设计模式中的一种--观察者模式.在一些应用场合,例如发送方并不是以固定频率发送消息,如果接收方频繁去咨询发送方,这种操作无疑是很麻烦并且不友好 ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- redis订阅与发布系统
一.概述 1.redis通过publish.subscribe等命令实现了订阅与发布模式. 2.这个功能提供两种信息机制,分别是订阅/发布到频道和订阅/发布到模式. 二.频道的订阅与信息发送 1.re ...
- Redis订阅和发布模式和Redis事务
-------------------Redis订阅和发布模式------------------- 1.概念 Redis 发布订阅(pub/sub)是一种消息通信模式: 发送者(pu ...
- Redis 订阅发布 - Jedis实现
Redis 订阅发布 - Jedis实现 我想到使用Redis的订阅发布模式是用来解决推送问题的-. 对于概念性的叙述,多多少少还是要提一下的: 什么是Redis发布订阅?Redis发布订阅是一种 ...
- python 实现redis订阅发布功能
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- ServiceStack.Redis订阅发布服务的调用(Z)
1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式.发布者和订阅者之间使用频 ...
- ServiceStack.Redis订阅发布服务的调用
1.Redis订阅发布介绍 Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式. 发布者和订阅者之间使用频 ...
- redis订阅关闭异常解决
redis订阅关闭异常解决 应用程序模块订阅redis运行一段时间出现一直重连Redis服务,日志如下: 2019-04-28 10:06:17,551 ERROR org.springframewo ...
随机推荐
- mybatis--第一个mybatis程序
首先,创建一个数据库my,并在数据库中插入一张表user,然后在user表中插入一行数据,代码如下: create database my; use my; create table user( id ...
- Linux系统运维工程师入门绝招放送
运维是干嘛的?安装服务器系统?重装系统再装系统?背锅的? 我就稀里糊涂的,这样报着必死的决心,考下RHCE认证,走上了Linux运维的道路,成为了一名linux运维工程师.有些心得跟大家分享下,避免小 ...
- MySQL多表创建关联及操作
外键 现在有两张表“分类表”和“商品表”,为了表明商品属于哪个 类别,通常情况下,我们将在商品上添加一列,用来存放分类的cid信息,此列成为外键. 此时,分类表 category 称作主表,cid 成 ...
- JEECG用户录入时用户账号长度修改
JEECG用户账号默认长度为10字符,但实际运用中很大可能大于10字符. 解决方法: 1.找到\webpage\system\user\user.jsp文件 <input id="us ...
- Javascript自增、自减运算符
JavaScript自增.自减运算符与表达式语法 var i++; var-- 声明变量 i-- 变量名 ++ -- 自增运算符 JavaScript自增.自减运算符与表达式 JavaScript自增 ...
- 被女朋友三番五次拉黑后,我用 Python 写了个“舔狗”必备神器
在一个阳光明媚的周日,我打开窗户呼吸了一口新鲜空气.阳光灿烂,岁月静好,又是一个约女朋友出去爬山吃饭看电影的好日子. 想到女朋友的大眼睛,我脸上不禁洋溢起了幸福的微笑.打开微信,给女朋友发出去一个美好 ...
- Python - 字符串为多行时,转换为列表
例如一个IP代理池,这是个字符串,有多行 120.236.137.65:8060 193.112.208.216:8118 121.8.98.198:80 121.8.98.197:80 121.8. ...
- 改变input[type=range]的样式 动态滑动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- redis持久化2
编程迷思 博客园 首页 联系 订阅 管理 随笔 - 11 文章 - 0 评论 - 318 深入学习Redis(2):持久化 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次 ...
- SPOJ Distinct Substrings
给定一个字符串,求不相同子串个数.每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同子串个数.总数为n*(n-1)/2,再减掉height[i]的和就是答案 #include< ...