Redis 订阅发布 - Jedis实现

我想到使用Redis的订阅发布模式是用来解决推送问题的~。

对于概念性的叙述,多多少少还是要提一下的:

什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~

说明

​ 本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。

Redis订阅与发布命令###

首先声明,有关Redis服务器的搭建工作,请自行查阅相关资料进行环境抢建

听说Redis中发布与订阅只有简单的6个命令。即:

  • PSUBSCRIBE pattern [pattern ...]

    • 订阅一个或者多个符合pattern格式的频道
  • PUBLISH channel message
    • 发布消息到chanel中
  • PUBSUB subcommand [argument [argument ...]]
    • 查看订阅与发布系统状态
  • PUNSUBSCRIBE [pattern [pattern ...]]
    • 退订所有符合格式的频道
  • SUBSCRIBE channel [channel ...]
    • 订阅一个或者多个频道
  • UNSUBSCRIBE [channel [channel ...]]
    • 取消订阅频道

例1 - SUBSCRIBE####

连接redis后键入命令

​ SUBSCRIBE study

这样便订阅了一个名为study的频道。

接下来study频道要发消息啦。~~


例2 - PUBLISH

另开启一个客户端,我使用的是品字形布局的最上面那个做为发布者,键入

​ PUBLISH study "message1-go go go"

可以看到,当客户端1在study频道发布消息时,客户端2(已订阅study频道)可以接收到c1发布的消息,而客户端3由于没有订阅study频道,所以接收不到c1发送的消息。


例3 - PSUBSCRIBE

现在,跟着博主左手,右手一个慢动作。在c3中键入

​ PSUBSCRIBE study*

OK,现在在c1中键入

​ PUBLISH study "message2"

上结果图:

c3采用的通配符的形式,也将study频道给订阅成功了。

接下来,在c1中继续键入命令:

​ PUBLISH study:java "I hate java forever"

可以看到,使用psubscribe不仅将study频道订阅了,而且将以study为首的频道也订阅了。


例4 - PUBSUB

在c1中键入pubsub channel,可以获得:

​ 127.0.0.1:6379> PUBSUB channels

​ 1) "study"

意为当前正在活跃的频道。


Jedis实现订阅发布者模式

​ 好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。

​ 首先,我们使用jedis先订阅一个名为:study的频道

然后我们先从命令行处进行消息发布:

之后 ,我们使用jedis在项目中进行消息发布:

我们可以进行正常的通信 ~噢耶~


核心代码:

PublishMessage.java 用于开启一个发布消息的线程###

private Logger logger = LoggerFactory.getLogger(PublishMessage.class);

@Resource
private JedisCluster jedisCluster; /**
* 发布消息
*
* @param channel 频道
* @param message 信息
*/
public void sendMessage(final String channel, final String message) {
Thread thread = new Thread(() -> {
Long publish = jedisCluster.publish(channel, message);
logger.info("服务器在: {} 频道发布消息{} - {}", channel, message, publish);
});
logger.info("发布线程启动:");
thread.setName("publishThread");
thread.start();
}

ChatSubscribe.java用于处理订阅相关事件,继承自JedisPubSub

private Logger logger = LoggerFactory.getLogger(ChatSubscribe.class);

// 取得订阅的消息后的处理
@Override
public void onMessage(String channel, String message) {
logger.info("订阅成功,接收到的消息为:频道-{},消息-{}", channel, message);
RedisString.message = message;
} // 取得按表达式的方式订阅的消息后的处理
@Override
public void onPMessage(String pattern, String channel, String message) {
System.out.println("-----取得按表达式的方式订阅的消息后的处理-----");
System.out.println(pattern + "=" + channel + "=" + message);
} // 初始化按表达式的方式订阅时候的处理
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
System.out.println("-----初始化按表达式的方式订阅时候的处理-----");
System.out.println(pattern + "=" + subscribedChannels);
} // 取消按表达式的方式订阅时候的处理
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
System.out.println("-----取消按表达式的方式订阅时候的处理-----");
System.out.println(pattern + "=" + subscribedChannels);
} @Override
public void onPong(String pattern) {
super.onPong(pattern);
} // 初始化订阅时候的处理
@Override
public void onSubscribe(String channel, int subscribedChannels) {
logger.info("初始化订阅信息:频道-{},订阅频道-{}", channel, subscribedChannels);
} // 取消订阅时候的处理
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
logger.info("已取消订阅频道{}", channel);
}

SubScribeMessage.java 订阅频道,取消频道等动作类

private Logger logger = LoggerFactory.getLogger(SubScribeMessage.class);

private ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

@Resource
private JedisCluster jedisCluster;
/**
* 订阅频道
*
* @param channel 频道
* @param roomSubListerner
*/
public void subscribeChannel(final String channel, final ChatSubscribe roomSubListerner) { cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
jedisCluster.subscribe(roomSubListerner, channel);
}
});
}

​ jedisCluster是否封装工具类,取自各位看官,核心代码已给出,请各位看官根据自身业务与逻辑,自行更改与优化代码。

​ 本次示例程序采用tomcat 9.0 + spring + springmvc

​ 使用了诸如:@RestController,@GetMapping等相关注解,便于开发,有兴趣可自行查阅spring相关资料。

Redis 订阅发布 - Jedis实现的更多相关文章

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

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

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

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

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

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

  4. 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用

    责任链模式的具体应用   1.业务场景 生产车间中使用的条码扫描,往往一把扫描枪需要扫描不同的条码来处理不同的业务逻辑,比如,扫描投入料工位条码.扫描投入料条码.扫描产出工装条码等,每种类型的条码位数 ...

  5. redis订阅发布简单实现

    适用场景 业务流程遇到大量异步操作,并且业务不是很复杂 业务的健壮型要求不高 对即时场景要求不高 原理介绍 redis官网文档:https://redis.io/topics/notification ...

  6. 2016022611 - redis订阅发布命令集合

    redis消息订阅发布命令 参考地址:http://www.yiibai.com/redis/redis_pub_sub.html 消息发送者发送消息,通过redis的channal,消息接收者获取消 ...

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

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

  8. redis订阅发布

    一.简介 Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订 ...

  9. 缓存数据库-redis(订阅发布)

    一:Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...

随机推荐

  1. tornado+WSGI+Apache

    1.原理 2.安装mod_wsgi http://pan.baidu.com/s/1sjsccWH configure的时候会找对应的python脚本,默认是/usr/bin/python 生成mod ...

  2. boot之mybatis

    特别注意,此种方法和starter不兼容,我用了两个方式混蛋,发现跑不起来! spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driv ...

  3. eclipse中hibernate和mybatis中xml配置文件的没有标签提醒解决方法

    当我们使用eclipse编写Mybatis或hibernate的xml文件时,面对众多标签的配置文件,却没有自动提醒,对于工作和学习都十分不方便. 之所以没有自动提醒,是因为dtd文件没有加载成功. ...

  4. flex布局元素操作详情

    之前布局一直用的是 position,float之类的,趁着国庆学习一下 flex 布局 父元素: flex-direction: row row-reverse column column-reve ...

  5. 《Metasploit魔鬼训练营》第七章学习笔记

    P314 木马程序的制作 msfpayload和msfencoder已被msfvenom取代.使用msfvenom -h查看具体用法.以下网址也有相关教程: https://github.com/ra ...

  6. 总结HTML5的学习方法大汇总

    html5学习方法之技能清单: 必须掌握基本的Web前端开收技术,其中包括:CSS.HTML.DOM.java.Ajax,jquery,Vue,jquery- mobile,zepto等,在掌握这些技 ...

  7. 2735:八进制到十进制-poj

    总时间限制:  1000ms 内存限制:  65536kB 描述 把一个八进制正整数转化成十进制. 输入 一行,仅含一个八进制表示的正整数a,a的十进制表示的范围是(0, 65536). 输出 一行, ...

  8. apache编译安装 httpd 2.2 httpd 2.4

    #apache编译安装#httpd 2.2 , httpd 2.4 #!/bin/sh #apache编译安装 #httpd 2.2 , httpd 2.4 #centos #rpm -e httpd ...

  9. js实现关键词高亮显示 正则匹配

    html 和ajax 部分就不写了,只需将需要匹配的文字传进去就可以了 比如匹配后台传回的字符串data.content中的关键词:直接调用: data.content = highLightKeyw ...

  10. codeforces 893C Rumor 前向星+dfs

    893C Rumor 思路: 前向星+DFS 代码: #include <bits/stdc++.h> using namespace std; #define _for(i,a,b) f ...