文档章节

redis 发布/订阅模式

學無止境
 學無止境
发布于 2017/07/21 15:36
字数 1087
阅读 70
收藏 1
点赞 1
评论 2

一:命令简介

  

从redis手册上面可以看到,其实“发布、订阅”模式才区区6个命令,下面听我一一解说下哈~~~

 

1. subscribe

SUBSCRIBE channel [channel ...]

订阅给定的一个或多个频道的信息。

     从上面的官方解释上来看,它的玩法有一点像现实生活中我们听收音机一个道理,要想听收音机,我们要做什么?肯定就是调频啦,只有在正

确的频道上面,我们才能听得到好听的节目,所以说subscribe首先要订阅一个频道(channel),下面我举个例子,开两个client,分别订阅着

msg 这个频道,比如下面这样:

 

2.publish

   到现在为止,这两个subscibe都在监视着msg这个频道,接下来,如果msg频道有消息传出,必定会被subscribe接收到,先我们还是看看

redis手册上怎么用这个命令。

PUBLISH channel message

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

看到上面命令的用法,我也就放心了。

看到么有,publish在msg这个频道上面发送消息后,被subscribe监视到了,然后就被分别打印输出了,好了,到现在为止,最基本的发布

订阅模式就是这样,是不是很简单哈。。。其实呢??? 也就是这么简单呐,但是呢,有时候我们还有这样一个需求,就是我能不能模糊匹

配key呢???举了例子,就是要求订阅china为前缀的所有频道,如果这样也可以做到的话,那确实是很牛逼啦。。。我要是回答的话,当

然啦,强大的redis自然会做到这一点,它提供了的命令就是:Psubscribe。

 

3. Psubscribe

PSUBSCRIBE pattern [pattern ...]

订阅一个或多个符合给定模式的频道。

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。

看到上面的解释,你心里可能就在想,这不就是正则匹配么。。。而且前缀“P”就是Pattern的意思,对吧,接下来我就订阅一下所有china为

前缀的channel。

好了,最常用的也就是这三个命令,接下来我们简单分析一下代码。

 

二: 源码简单分析

  其实redis的发布订阅模式,使用RedisServer下面的 pubsub_channels字典 和 pubsub_patterns数组存放的,所有的操作代码都

在pubsub.c文件下,如下图:

1.   pubsub_channels 

      可以看到,它是一个字典结构,通过注释你应该明白,它的key为channel,value为list。

 

2.   pubsub_patterns

      同样从注释中,你可以看到,其实它就是存放模式匹配的subscribe的clients列表,对吧,用一个list数组实现。

 

3.   subcribeCommand

      通过下面的代码,你是不是在脑子里面很有轮廓了???其实这个pubsub_channels果然就是key=channel,value=list的存放模式,

这个list就是所谓的clients列表,这样的话,你就知道了哪些key挂了哪些clients,对吧,如果再publish的话,只需要遍历一下这个list就知

道结果了。

 

4.  publishCommand

  先前也说了,publish的原理很简单,就是找到字典中的channel这个key,获取到clients之后,遍历client的来发送信息。

   

同样的道理,pubsub_patterns也是差不多的实现,只要大家简单看一下pubsub.c这个源代码文件,差不多都会懂得,没啥好说的,

希望这篇对你有用~

© 著作权归作者所有

共有 人打赏支持
學無止境
粉丝 4
博文 27
码字总数 11503
作品 0
广州
后端工程师
加载中

评论(2)

學無止境
學無止境

引用来自“liugh_develop”的评论

这么好的文章怎么没有人赞呢
谢谢,你们的认可就是我前进的动力呀。:grin:
我叫刘半仙
我叫刘半仙
这么好的文章怎么没有人赞呢
redis源码分析之发布订阅(pub/sub)

redis算是缓存界的老大哥了,最近做的事情对redis依赖较多,使用了里面的发布订阅功能,事务功能以及SortedSet等数据结构,后面准备好好学习总结一下redis的一些知识点。 先看下redis发布订阅...

凌风郎少 ⋅ 2017/11/05 ⋅ 0

Redis发布与订阅功能

发布/订阅”功能包含两种角色:发布者和订阅者。Redis的发布与订阅功能由publish、subscribe、psubscribe等命令组成。通过执行publish命令可以发布消息;通过执行subscribe命令,客户端可以订...

u012050154 ⋅ 2017/11/29 ⋅ 0

Redis:pub/sub实现消息发布/订阅

转载自http://www.runoob.com/redis/redis-pub-sub.html Redis 发布订阅 Redis 的 Pub/Sub 可以用来实现简单的订阅机制。一个或多个 client 向 Redis 订阅特定的频道,当某个 client 向这个频...

特拉仔 ⋅ 06/01 ⋅ 0

Java实现Redis发布/订阅

今天经理让我实现一个Redis发布/订阅功能,用来记录审计信息。我查了一天,才弄出来。总结如下,大神勿喷。第二天我百度“JedisPubSub ”发现好多代码,后来测试了一下发现,百度关键词“Jed...

夜辰 ⋅ 2016/03/28 ⋅ 2

redis 事务及锁应用/发布订阅/

分类: NoSQL MySQL Redis 开启 Start transaction mutil 语句 普通SQL 普通命令 失败 rollback discard 成功 commit exec 注:rollback和discard的区别,如果已经成功执行了2条语句,第三条语...

泡海椒 ⋅ 2016/04/04 ⋅ 0

Redis——发布订阅(subscribe)

Redis发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。 Redis客户端可以订阅任意数量的频道。 发布订阅的基本命令 1、SUBSCRIBE channel [ channel...

Allenyan ⋅ 05/13 ⋅ 0

Redis学习笔记~分布式的Pub/Sub模式

redis的客户端有很多,这次用它的pub/sub发布与订阅我选择了StackExchange.Redis,发布与订阅大家应该很清楚了,首先一个订阅者,订阅一个服务,服务执行一些处理程序(可能是写个日志,插入...

mcy247 ⋅ 2017/12/07 ⋅ 0

Redis的Pub/Sub模式

Redis同样支持消息的发布/订阅(Pub/Sub)模式,这和中间件activemq有些类似。订阅者(Subscriber)可以订阅自己感兴趣的频道(Channel),发布者(Publisher)可以将消息发往指定的频道(C...

摆渡者 ⋅ 2016/01/12 ⋅ 0

redis 订阅者发布者

下面的代码使用redis实现订阅/发布。需要jedis的2.0.0和SLF4J的jar包。 redis提供 一组命令实现订阅者发布者模式,publisher subscriber。实现进程间通信! 在redis中可以同时订阅多个频道,...

戢冠生 ⋅ 2016/04/29 ⋅ 0

快速掌握Redis——第五招:pub/sub 发布/订阅

1 简易模型 订阅端: Subscribe 频道名称发布端: publish 频道名称 发布内容(远程主机新建两个ssh连接,分别执行pub和sub任务)格式: publish redisChat messagesubscribe redisChatredisC...

vasks ⋅ 2015/03/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 16分钟前 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

楠木楠 ⋅ 28分钟前 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 57分钟前 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 57分钟前 ⋅ 0

Docker Toolbox Looks like something went wrong

Docker Toolbox 重新安装后提示错误:Looks like something went wrong in step ´Checking if machine default exists´ 控制面板-->程序与应用-->启用或关闭windows功能:找到Hyper-V,如果处......

随你疯 ⋅ 今天 ⋅ 0

Guacamole 远程桌面

本文将Apache的guacamole服务的部署和应用,http://guacamole.apache.org/doc/gug/ 该链接下有全部相关知识的英文文档,如果水平ok,可以去这里仔细查看。 一、简介 Apache Guacamole 是无客...

千里明月 ⋅ 今天 ⋅ 0

nagios 安装

Nagios简介:监控网络并排除网络故障的工具:nagios,Ntop,OpenVAS,OCS,OSSIM等开源监控工具。 可以实现对网络上的服务器进行全面的监控,包括服务(apache、mysql、ntp、ftp、disk、qmail和h...

寰宇01 ⋅ 今天 ⋅ 0

AngularDart注意事项

默认情况下创建Dart项目应出现以下列表: 有时会因为不知明的原因导致列表项缺失: 此时可以通过以下步骤解决: 1.创建项目涉及到的包:stagehand 2.执行pub global activate stagehand或pub...

scooplol ⋅ 今天 ⋅ 0

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部