Redis从入门到放弃(3):发布与订阅
1、介绍
Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(Pub/Sub)。
发布订阅是一种消息传递模式,它允许消息的发布者(发布者)将消息发送给多个订阅者(订阅者)而不必知道订阅者的存在。这种模式在许多应用中都非常有用,例如实时通知、事件处理、聊天应用等。

2、如何使用发布订阅
2.1、订阅频道
要订阅一个频道,首先需要使用 SUBSCRIBE 命令。假设我们有一个频道名为 notifications,下面是订阅该频道的示例代码:
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> SUBSCRIBE notifications
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "notifications"
3) (integer) 1 # 返回值为当前已订阅的频道数量
当执行以上命令后,当前客户端就会进入订阅状态,它将持续等待来自 notifications 频道的消息。如果频道不存在,那么客户端将一直阻塞,直到有消息发布到该频道。
2.2、发布消息
要发布一条消息到指定的频道,使用 PUBLISH 命令。下面是发布一条消息到 notifications 频道的示例代码:
发布端(发布消息):
[root@ds-huangshan-01 src]# ./redis-cli
127.0.0.1:6379> publish notifications "hello world!"
(integer) 1
执行以上命令后,所有已经订阅 notifications 频道的客户端都会收到消息 "hello world!"。
"message"
"notifications"
"hello world!"
2.3、取消订阅
如果客户端不再需要接收特定频道的消息,可以使用 UNSUBSCRIBE 命令来取消订阅。如果没有指定频道名,则客户端将取消所有频道的订阅。
UNSUBSCRIBE notifications
2.4、模式订阅
除了普通的频道订阅,Redis还支持模式订阅(Pattern Subscriptions)。模式订阅允许客户端订阅满足特定模式的频道。
例如,假设我们有多个频道名以 "notifications:" 开头,后面跟着不同的分类(例如 "notifications:news"、"notifications:sports" 等)。要订阅所有以 "notifications:" 开头的频道,可以使用以下命令:
PSUBSCRIBE notifications:*
2.5、取消模式订阅
取消模式订阅使用 PUNSUBSCRIBE 命令,用法与取消普通频道订阅类似。
PUNSUBSCRIBE notifications:*
有关订阅命令有两点需要注意:
- 客户端在执行订阅命令之后进入了订阅状态,只能接收 subscribe、psubscribe、 unsubscribe、 punsubscribe 的四个命令。
- 新开启的订阅客户端,无法收到该频道之前的消息,因为 Redis 不会对发布的消息进行持久化。
3、使用案例(伪代码)
消息通知: 在一个Web应用程序中,可以使用发布订阅功能来向所有在线用户发送实时通知,比如新消息、新订单等。
Redis发布者代码:
import redis.clients.jedis.Jedis;
public class RedisPublisher {
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 发布消息到频道
jedis.publish("notifications", "Hello, world!");
// 关闭连接
jedis.close();
}
}
// Redis订阅者代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisSubscriber extends JedisPubSub {
@Override
public void onMessage(String channel, String message) {
System.out.println("Received message: " + message + " from channel: " + channel);
// 在这里可以实现发送通知给在线用户的逻辑
}
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
// 创建订阅者实例
RedisSubscriber subscriber = new RedisSubscriber();
// 订阅频道
jedis.subscribe(subscriber, "notifications");
// 关闭连接
jedis.close();
}
}
4、Redis的发布订阅与ActiveMQ、RocketMQ区别
Redis的发布订阅与ActiveMQ、RocketMQ是不同类型的消息传递系统,它们有以下区别:
消息队列模式 vs. 发布订阅模式:
- ActiveMQ和RocketMQ是消息队列系统,它们遵循消息队列模式。消息队列将消息发送到一个或多个消费者,每个消息只能由一个消费者处理。
- Redis的发布订阅是一种发布者-订阅者模式,其中一个消息可以广播给多个订阅者。
持久性:
- ActiveMQ和RocketMQ通常支持消息的持久性,可以确保即使在消费者离线的情况下,消息不会丢失。
- Redis的发布订阅默认不支持持久性。一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
功能特性:
- ActiveMQ和RocketMQ提供了丰富的功能,如消息重试、消息顺序保证、延迟消息等。
- Redis的发布订阅相对简单,主要用于实时通知和简单消息的发布与订阅。
分布式特性:
- ActiveMQ和RocketMQ都是为分布式环境而设计的,支持集群和负载均衡。
- Redis可以在分布式环境中使用,但其发布订阅功能相对来说较为简单,不如ActiveMQ和RocketMQ在复杂分布式场景下灵活。
总的来说,如果需要一个功能丰富且专注于消息队列模式的消息传递系统,可以选择ActiveMQ或RocketMQ。而如果只需简单的发布订阅功能,Redis的发布订阅是个不错的选择。
Redis从入门到放弃(3):发布与订阅的更多相关文章
- Redis 从入门到放弃
Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/
- Redis——从入门到放弃
redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, ...
- Redis源码解析:30发布和订阅
Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现. 通过执行SUBSCRIBE命令,客户端可以订阅 ...
- 【笔记】《Redis设计与实现》chapter18 发布与订阅
chapter18 发布与订阅 客户端订阅频道. 客户端向频道发送消息, 消息被传递至各个订阅者. 匹配模式 客户端订阅模式. 客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者. 另一个模 ...
- 转载RabbitMQ入门(3)--发布和订阅
发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...
- redis从入门到放弃 -> 部署方案
单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...
- redis从入门到放弃 -> 简介&概念
一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...
- 发布 Android Library 到 JCenter 从入门到放弃
最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史.好,接下来,直奔主题,以下是发布流程. 发布到 JCenter 发布到 JCente ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
- Go从入门到放弃
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
随机推荐
- 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用!
简介 大家好,为了使开源项目的维护和管理更方便一些,出于个人需求写了一款开源项目的模板,该模板基于 Github 平台,并使用 .NET 来实现管道功能. 在接受过实战检验后, 于今天开源, 项目地址 ...
- html/css 添加图片
通过img.src添加图片 添加一个img元素,设置content,会发现在IE.safari等浏览器内显示为空白. 一般我们使用img,是通过src来设置的,可以通过react的import图片添加 ...
- DP做题记录
P1140 相似基因 考虑如何设计状态. 设给出的两个串为串 \(A\) 和串 \(B\),长度分别为 \(n\) 和 \(m\). 我们用 \(f[i][j]\) 来表示前 \(i\) 个 \(A\ ...
- mysql-高级功能(触发器、存储过程、视图、事务)
目录 触发器-created trigger 1.触发器分为六种情况 2.语法结构 3.创建触发器 4.查询/删除触发器 存储过程-created procedure 1.创建存储过程 2.使用存储过 ...
- express服务器框架
Express 为了提高开发效率,我们在开发过程中,都会尽量使用别人已经开发好的第三方模块,而我们想要快速实现服务器端的开发,推荐一个当下比较流行的框架:Express Express 作为开发框架, ...
- 2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库。
2023-03-12:mp3音频解码为pcm,代码用go语言编写,调用moonfdd/ffmpeg-go库. 答案2023-03-12: 用github/moonfdd/ffmpeg-go库. 命令如 ...
- 2020-10-25:go中channel的close流程是什么?
福哥答案2020-10-25:
- 2022-07-29:一共有n个人,从左到右排列,依次编号0~n-1, h[i]是第i个人的身高, v[i]是第i个人的分数, 要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的。
2022-07-29:一共有n个人,从左到右排列,依次编号0~n-1, h[i]是第i个人的身高, v[i]是第i个人的分数, 要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的. ...
- liunx操作系统下配置服务器
centos7 下配置服务器基本步骤 1,yum install 服务器名称 2,关闭防火墙,配置服务器配置文件,开启服务, 3,创建文件,设置访问权限, 4,本地登陆,测试服务器能否连通
- Post-Exploitation Basics
开发后基础知识 https://tryhackme.com/room/postexploit 使用 mimikatz.bloodhound.powerview 和 msfvenom 学习后期开发和维护 ...