
Redis(十)订阅和发布(sub/pub)以及Java实现代码
单个频道订阅:
发布日期:2021-05-14 13:57:31
浏览次数:17
分类:精选文章
本文共 2801 字,大约阅读时间需要 9 分钟。
Redis 发布与订阅命令详解
随着消息队列技术在现代应用中的广泛应用,Redis 的订阅发布功能成为了开发者获取高效数据通知的重要工具。本文将详细介绍 Redis 中的发布订阅命令,并提供实际案例说明。
Publish 命令
发布的核心命令是 publish
,用于向指定频道推送消息。命令格式如下:
PUBSUB pattern [channel] [message]
例如:
PUBSUB "mychan" "hello world"
关键点说明:
channel
:指定要推送的频道。message
:要发送的消息内容。
此外,可以选择不指定 channel
,默认使用已经订阅的频道。
Subscribe 命令
订阅命令用于监听特定频道的消息,主要有以下类型:
SUBSCRIBE channel
- 多个频道订阅:
- 模式订阅(支持通配符,* 表示任意前缀):
- 单个频道订阅会自动订阅该频道并等待消息发 sending。
- 模式订阅可以根据特定规则筛选频道。
- 取消单个频道订阅:
- 取消多个频道订阅:
- 取消所有订阅:
- 当使用
*
时,需谨慎操作,以防误删所有订阅。 - 全匹配通配符:
- 多级通配符:
-
发布和订阅的 latency:消息发布与订阅之间可能存在延迟,需根据具体使用场景进行优化。
-
消息持久性:根据需求设置消息的持久性,使用
PERSIST
公式。 -
频道管理:合理管理频道数量,避免过度订阅导致性能问题。
SUBSCRIBE chan1,chan2,chan3
PSUBSCRIBE pattern channel
关键点说明:
Unsubscribe 命令
取消订阅的命令方式有以下几种:
UNSUBSCRIBE channel
UNSUBSCRIBE chan1,chan2
UNSUBSCRIBE *
注意事项:
常见订阅模式示例
PSUBSCRIBE it* # 匹配所有以 `it` 开头的频道
PSUBSCRIBE news.* it.* # 匹配所有以 `news.` 和 `it.` 开头的频道
Java 实现示例
在实际开发中,集成 Redis 的订阅发布功能需自定义发布者和订阅者类。以下是一个简化的 Java 实现:
// Publisher 类public class Publisher implements Runnable { private final JedisPool jedisPool; Publisher(JedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public void run() { try { Jedis jedis = jedisPool.getResource(); Scanner scanner = new Scanner(System.in); while (true) { String input = scanner.nextLine(); if (!"quit".equals(input)) { jedis.publish("broadcast_channel", input); } else { break; } } } catch (IOException e) { e.printStackTrace(); } }}// Subscriber 类public class Subscriber extends JedisPubSub { @Override public void onMessage(String channel, String message) { System.out.println("收到消息:" + channel + ":" + message); } // 其他回调方法保持默认}
测试与验证
配置好 Redis 环境后,可以运行以下代码测试订阅发布功能:
// 测试发布者public class Doit { public static void main(String[] args) throws InterruptedException { Doit.PublishTest pt = new Doit.PublishTest(); pt.run(); }}class PublishTest { private final Jedis jedis = new Jedis("localhost"); void run() { try { new Thread(() -> { // 发布消息 for (; ; ) { String input = jedis荡(); if (!" quit ".trim().equals(input)) { jedis.publish("broadcast_channel", input); } } }).start(); // substrate 接收消息 jedisевые subscribe(ain,, "broadcast_channel")(); while (true) { System.in.read(); } } catch (Exception e) { e.printStackTrace(); } }}
注意事项
通过以上内容,开发者可以充分理解和掌握 Redis 的订阅发布功能,灵活应对不同场景下的数据通知需求。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月30日 09时05分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
HTTP协议状态码详解(HTTP Status Code)
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
04_Mysql配置文件(重要参数)
2019-03-06
JavaSE总结
2019-03-06
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2019-03-06
Python IO编程
2019-03-06
CSS入门总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06
基于 HTML5 WebGL 的污水处理厂泵站自控系统
2019-03-06
django-表单之模型表单渲染(六)
2019-03-06
c++之程序流程控制
2019-03-06
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2019-03-06
有道云笔记 同步到我的博客园
2019-03-06