redis 发布订阅

摘要:
redis发布订阅发布订阅是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。redis作为一个pub/subserver,在订阅者和发布者之间起到了消息路由的功能。当发布者通过publish命令向redisserver发送特定类型的消息时。redis-cli打印到控制台的订阅成功消息表示使用psubscribe命令订阅news.*成功后,连接订阅通道总数为1。redis返回的2表示有两个连接收到了此消息。
redis 发布订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。
下面做个实验。这里使用两个不同的client一个是redis自带的redis-cli另一个是用java写的简单的client。代码如下:

publicclass PubSubTest extends JedisPubSub {

@Override

publicvoid onMessage(String channel, String message) {

// TODO Auto-generated method stub

System.out.println("onMessage: channel["+channel+"], message["+message+"]");

}

@Override

publicvoid onPMessage(String pattern, String channel, String message) {

// TODO Auto-generated method stub

System.out.println("onPMessage: channel["+channel+"], message["+message+"]");

}

@Override

publicvoid onPSubscribe(String channel, int subscribedChannels) {

// TODO Auto-generated method stub

System.out.println("onSubscribe: channel["+channel+"],"+

"subscribedChannels["+subscribedChannels+"]");

}

@Override

publicvoid onPUnsubscribe(String channel, int subscribedChannels) {

// TODO Auto-generated method stub

System.out.println("onUnsubscribe: channel["+channel+"], "+

"subscribedChannels["+subscribedChannels+"]");

}

@Override

publicvoid onSubscribe(String pattern, int subscribedChannels) {

// TODO Auto-generated method stub

System.out.println("onPUnsubscribe: pattern["+pattern+"],"+

"subscribedChannels["+subscribedChannels+"]");

}

@Override

publicvoid onUnsubscribe(String pattern, int subscribedChannels) {

// TODO Auto-generated method stub

System.out.println("onPSubscribe: pattern["+pattern+"], "+

"subscribedChannels["+subscribedChannels+"]");

}

publicstaticvoid main(String[] args) {

Jedis j = new Jedis("192.168.168.128",6379);

PubSubTest pb = new PubSubTest();

try {

pb.proceed(j.getClient(), "news.share", "news.blog");

} catch (Exception e) {

// TODO: handle exception

}finally{

if(j!=null){

j.disconnect();

}

}

}

}

1首先运行此java程序:

onSubscribe: channel[news.share], subscribedChannels[1]

onSubscribe: channel[news.blog], subscribedChannels[2]

2启动redis-cli:

redis 127.0.0.1:6379> psubscribe news.*

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

1) "psubscribe"

2) "news.*"

3) (integer) 1

3再启动一个redis-cli用来发布两条消息:

redis 127.0.0.1:6379> publish news.share "share a link http://www.google.com"

(integer) 2

redis 127.0.0.1:6379> publish news.blog "I post a blog"

(integer) 2

4.查看两个订阅client的输出此时java client打印如下内容:

onMessage: channel[news.share], message[share a link http://www.google.com]

onMessage: channel[news.blog], message[I post a blog]

另一个redis-cli输出如下:

1) "pmessage"

2) "news.*"

3) "news.share"

4) "share a link http://www.google.com"

1) "pmessage"

2) "news.*"

3) "news.blog"

4) "I post a blog"

redis client使用psubscribe订阅了一个使用通配符的通道(*表示任意字符串),此订阅会收到所有与news.*匹配的通道消息。redis- cli打印到控制台的订阅成功消息表示使用psubscribe命令订阅news.*成功后,连接订阅通道总数为1。
当我们在一个client使用publish向news.share和news.blog通道发出两个消息后。redis返回的(integer) 2表示有两个连接收到了此消息。
看完一个小例子后应该对pub/sub功能有了一个感性的认识。需要注意的是当一个连接通过subscribe或者psubscribe订阅通道后就进入订阅模式。在这种模式除了再订阅额外的通道或者用unsubscribe或者punsubscribe命令退出订阅模式,就不能再发送其他命令。另外使用psubscribe命令订阅多个通配符通道,如果一个消息匹配上了多个通道模式的话,会多次收到同一个消息。
redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持

免责声明:文章转载自《redis 发布订阅》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TSQL 定义分割字符串的函数json-server配置模拟数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#值类型和引用类型

转自:https://www.cnblogs.com/bakuhert/articles/5878086.html 什么是值类型,什么是引用类型 概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。 引用类型:基类为Objcet 值类型:均隐式派生自System.ValueType: 值类型: byte,short,...

基于 .NET 的 FluentValidation 验证教程

FluentValidation 是一个基于 .NET 开发的验证框架,开源免费,而且优雅,支持链式操作,易于理解,功能完善,还是可与 MVC5、WebApi2 和 ASP.NET CORE 深度集成,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言。 虽然 FluentValidation 是一个非常强大的验证框架,但针对该框...

wxpython ItemContainer

ItemContainer 是 很多可以添加string item的部件的父类,封装很多有用的方法,可以用来获取部件的被选中item 的string 如wx.ListBox ,wx.CheckListBox,wx.Choice,wx.ComboBox。 这些部件可以添加string ,并且内部对它们索引访问。  string GetString(self,...

操作系统内存大页(THP)对redis性能的影响

目录 THP THP对redis的影响 关闭THP redis启动日志的warning: WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues...

测试开发进阶——spring boot——MVC——get访问——使用@RequestParam获取参数(参数个数一致)

控制器: package com.awaimai.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframewo...

PHP单点登陆

本文主要介绍了利用webservice,session,cookie技术,来进行通用的单点登录系统的分析与设计。具体实现语言为PHP。单点 登录,英文名为Single Sign On,简称为 SSO,是目前企业,网络业务的用户综合处理的重要组成部分。而SSO的定义,是在多个应用系统中,用户只需要登陆一次就可以访问所有相互信任的应用系 统。 动机: 用过uc...