Redis 订阅发布_Jedis实现方法
发布时间 - 2026-01-11 01:57:51 点击率:次我想到使用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实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# redis实现发布订阅
# redis发布订阅Java代码实现过程解析
# redis发布订阅_动力节点Java学院整理
# redis发布和订阅_动力节点Java学院整理
# Redis发布订阅和实现.NET客户端详解
# 浅谈我是如何用redis做实时订阅推送的
# 客户端
# 多个
# 给大家
# 可以看到
# 相关资料
# 命令行
# 的是
# 是在
# 是一种
# 好了
# 就能
# 退订
# 我们可以
# 也将
# 希望能
# 采用了
# 有兴趣
# 我所
# 要比
# 分别为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何发送系统通知?(Notification渠道示例)
浅析上传头像示例及其注意事项
,南京靠谱的征婚网站?
Mybatis 中的insertOrUpdate操作
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
android nfc常用标签读取总结
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
韩国服务器如何优化跨境访问实现高效连接?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel如何处理文件下载请求?(Response示例)
如何构建满足综合性能需求的优质建站方案?
如何在IIS中配置站点IP、端口及主机头?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
详解jQuery中基本的动画方法
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
香港服务器租用费用高吗?如何避免常见误区?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Python自动化办公教程_ExcelWordPDF批量处理案例
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
网页设计与网站制作内容,怎样注册网站?
如何快速生成ASP一键建站模板并优化安全性?
如何用花生壳三步快速搭建专属网站?
微信小程序 五星评分(包括半颗星评分)实例代码
利用JavaScript实现拖拽改变元素大小
JavaScript如何操作视频_媒体API怎么控制播放
魔方云NAT建站如何实现端口转发?
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
如何在阿里云虚拟主机上快速搭建个人网站?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
QQ浏览器网页版登录入口 个人中心在线进入
七夕网站制作视频,七夕大促活动怎么报名?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何快速搭建虚拟主机网站?新手必看指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何安全更换建站之星模板并保留数据?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel Fortify是什么,和Jetstream有什么关系
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略

