发布与订阅(又称pub/sub),订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message).每当有消息被发送给指定频道的时候,频道都所有订阅者都会收到消息。

Redis提供都5个发布订阅命令:

命令 描述
Redis Psubscribe 命令 订阅一个或多个符合给定模式的频道。
Redis Pubsub 命令 查看订阅与发布系统状态。
Redis Publish 命令 将信息发送到指定的频道。
Redis Punsubscribe 命令 退订所有给定模式的频道。
Redis Subscribe 命令 订阅给定的一个或多个频道的信息。
Redis Unsubscribe 命令 指退订给定的频道。

使用实例:

  首先需要一个订阅者(listener)这里建立一个名为Subscriber的类:

public class Subscriber extends JedisPubSub {

    public void onMessage(String channel, String message) {
System.out.println("onMessage channel = " + channel+ "message =" + message);
} public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",
channel, subscribedChannels));
} public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",
channel, subscribedChannels)); }
}

这个类继承自JedisPubSub,其中onMessage负责接收订阅频道消息后,业务处理逻辑,onSubscribe负责初始化订阅时候的处理,onUnsubscribe取消订阅时候的处理。

然后在定义一个类起一个线程来进行subscribe操作,因为我们需要订阅者一直在线,当发布者一发送消息到相应的频道时,能做出反应

public class SubThread extends Thread {
JedisPool pool;
private final Subscriber subscriber = new Subscriber(); private final String channel = "xx"; public SubThread( JedisPool pool) {
super("SubThread");
this.pool = pool;
} @Override
public void run() {
System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
Jedis jedis = pool.getResource();
try {
jedis.subscribe(subscriber, channel);
} catch (Exception e) {
System.out.println(String.format("subsrcibe channel error, %s", e));
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}

再然后就是发布者:

public class Publisher {

    JedisPool pool;

    public Publisher( JedisPool pool) {
this.pool = pool;
} public void start() {
Jedis jedis = pool.getResource();
while(true) {
jedis.publish("xx", "233");
try{
Thread.sleep(5000);
}catch (Exception e){
e.printStackTrace();
} }
}
}

再然后就是主函数的调用:

public class test1 {
public static void main(String[] args) throws Exception{
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping()); JedisPool pool = new JedisPool("localhost", 6379); SubThread subThread = new SubThread(pool);
subThread.start(); Publisher publisher = new Publisher(pool);
publisher.start(); }

因为Jedis不是线程安全的,JedisPool是线程安全的,所以这里使用JedisPool。

输出:

连接成功
服务正在运行: PONG
subscribe redis, channel xx, thread will be blocked
subscribe redis channel success, channel xx, subscribedChannels 1
onMessage channel = xxmessage =233
onMessage channel = xxmessage =233

Redis——发布和订阅的更多相关文章

  1. 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

    本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...

  2. Redis - 发布和订阅

    一.概述 1). 发布和订阅是一种消息通信模式. 2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. 二.发布和订阅 订阅命令: // 订阅一个或多个频道 // 返回值:v ...

  3. redis发布与订阅

    发布与订阅 除了实现任务队列外, Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式. "发布/订阅"模式同样可 ...

  4. redis 发布和订阅实现

    参考文献 15天玩转redis -- 第九篇 发布/订阅模式 <Redis设计与实现> 命令简介 在redis用户手册中,跟发布订阅相关的命令有如下的六个: PSUBSCRIBE PUBL ...

  5. redis 发布与订阅原理分析

    前言:用了redis也有一段时间了,但是发布与订阅的使用频率也不高,趁着这次空闲,深究下redis的发布与订阅模式. 一.订阅频道和信息发布 功能说明:Redis 的 SUBSCRIBE 命令可以让客 ...

  6. php swoft redis 发布和订阅

    //订阅 public function subscribe() { /* @var \Swoft\Redis\Redis $redis */ $redis = App::getBean(\Swoft ...

  7. Redis 发布与订阅模式

    subscribe  订阅 publish   发布   频道    发布内容

  8. Redis 发布与订阅 消息

    基于Redis消息队列-实现短信服务化 1.Redis实现消息队列原理 常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务. ...

  9. 03 Redis发布与订阅

    以qq群的公告,单个发布者,多个收听者为例 发布/订阅 实验 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE ch ...

随机推荐

  1. 设计模式:代理模式是什么,Spring AOP还和它有关系?

    接着学习设计模式系列,今天讲解的是代理模式. 定义 什么是代理模式? 代理模式,也叫委托模式,其定义是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.它包含了三个角色: Subject: ...

  2. Redis+Twemproxy分片存储实现

    from unsplash 为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式 ...

  3. 卸载 python 3.7.3 再安装 遇到 error 0x80070001

    这件事告诉我,千万不要手贱,闲的发慌蛋疼 手贱把用得好好的python 3.7.3 卸载后怎么装也装不回去, 告诉我遇到了 error 0x80070001 最终还是靠强大的谷歌找到了办法,幸好没有重 ...

  4. ServiceFabric极简文档-5.1 编程模型选择

    项目中:actor用的服务是无状态服务:ASP.NET Core用的是无状态ASP.NET Core模板. ​

  5. Java编程思想:文件加锁

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...

  6. ISTQB TTA大纲中提到的参考书目

    在2012版大纲(可以点击这里下载查看)第12页"2.2条件测试"标题上方有这样一句话: 参考[Bath08],[Beizer90],[Beizer95],[Copeland03] ...

  7. Scrum 使用絮叨

    关于Scrum 的一些絮叨 Scrum 的推行的基础在于全员参与,全员协作,包含Dev, QA(quality assurance) ,BA(Business analyst)以及Supporter ...

  8. Lucene01--倒排索引思想

    Lucene01--倒排索引思想 1. 倒排索引的概念: 首先对数据按列拆分存储,然后对文档中的数据分词,对词条进行索引,并记录词条在文档中出现的位置.这样查找时只要找到了词条,就找到了对应的文档.概 ...

  9. C#中面向对象编程中的函数式编程详解

    介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...

  10. 分组在re模块中的使用以及使用正则表达式的技巧

    1.split:切割 使用split不会返回被切割的字符 import re ret = re.split("\d+","5as46asf46asf46a") ...