Redis 订阅发布 - Jedis实现
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实现的更多相关文章
- ServiceStack.Redis订阅发布服务的调用(Z)
1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式.发布者和订阅者之间使用频 ...
- ServiceStack.Redis订阅发布服务的调用
1.Redis订阅发布介绍 Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式. 发布者和订阅者之间使用频 ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用
责任链模式的具体应用 1.业务场景 生产车间中使用的条码扫描,往往一把扫描枪需要扫描不同的条码来处理不同的业务逻辑,比如,扫描投入料工位条码.扫描投入料条码.扫描产出工装条码等,每种类型的条码位数 ...
- redis订阅发布简单实现
适用场景 业务流程遇到大量异步操作,并且业务不是很复杂 业务的健壮型要求不高 对即时场景要求不高 原理介绍 redis官网文档:https://redis.io/topics/notification ...
- 2016022611 - redis订阅发布命令集合
redis消息订阅发布命令 参考地址:http://www.yiibai.com/redis/redis_pub_sub.html 消息发送者发送消息,通过redis的channal,消息接收者获取消 ...
- python 实现redis订阅发布功能
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- redis订阅发布
一.简介 Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订 ...
- 缓存数据库-redis(订阅发布)
一:Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...
随机推荐
- Python 直接赋值、浅拷贝和深度拷贝全解析
直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思).这个人比较自由单身狗嘛 可以恋爱可以分手 就是一个小屌丝. 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的 ...
- 2017年php面试题汇总
1.http状态码 200 这个没有什么好说的,是代表请求被正常的处理成功了 302 代表临时重定向 400 400表示请求报文中存在语法错误.需要修改后再次发送 403 表明请求访问的资源被拒绝了. ...
- Unity3D高性能战争迷雾实现
效果图 先上效果图吧,这是为了吸引到你们的ヽ(。◕‿◕。)ノ゚ 战争迷雾效果演示图 战争调试界面演示图 由于是gif录制,为了压缩图片,帧率有点低,实际运行时,参数调整好是不会像这样一卡一顿的. 战争 ...
- 软件测试博客日记Day02-11.16日 —— 赵天宇 —— 禅道的使用和配置
禅道 1. 安装 1. 进入禅道的官方下载地址:http://www.zentao.net/download/80053.html 2. 下载禅道开源版本. 3. 正常安装,注意一定要放在根目录下. ...
- [最短路][部分转]P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...
- spring boot 错误,求大神帮解决
Exception in thread "main" java.lang.IllegalStateException: Failed to read Class-Path attr ...
- 晓莲说-何不原创:如何通过jad把class批量反编译成java文件
背景:前几天在项目开发的时候遇到一个问题,那就是利用myeclipse编写好的一个项目打包成jar包后上传部署到服务器里,之后本地的项目被自己改来改去出现了一些问题,想着把上传到服务器里面的war包下 ...
- 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...
- linux上安装php7 memcache扩展 和 安装服务端memcached
linux上安装memcached不算太困难.唯一让本人感到困难的是 php7的memcache扩展安装.真的蛋疼! 先说安装服务端 memcached 1. 首先安装Libevent事件触发管理器. ...
- Centos下抓包
刚才遇到一个问题,微信配置时token总是失败. 于是抓一下服务器的包.看看是否是数据传输出了问题. 先安装工具 [Shell] 纯文本查看 复制代码 ? 1 yum install -y wires ...