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:*

有关订阅命令有两点需要注意:

  1. 客户端在执行订阅命令之后进入了订阅状态,只能接收 subscribe、psubscribe、 unsubscribe、 punsubscribe 的四个命令。
  2. 新开启的订阅客户端,无法收到该频道之前的消息,因为 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是不同类型的消息传递系统,它们有以下区别:

  1. 消息队列模式 vs. 发布订阅模式:

    • ActiveMQ和RocketMQ是消息队列系统,它们遵循消息队列模式。消息队列将消息发送到一个或多个消费者,每个消息只能由一个消费者处理。
    • Redis的发布订阅是一种发布者-订阅者模式,其中一个消息可以广播给多个订阅者。
  2. 持久性:

    • ActiveMQ和RocketMQ通常支持消息的持久性,可以确保即使在消费者离线的情况下,消息不会丢失。
    • Redis的发布订阅默认不支持持久性。一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
  3. 功能特性:

    • ActiveMQ和RocketMQ提供了丰富的功能,如消息重试、消息顺序保证、延迟消息等。
    • Redis的发布订阅相对简单,主要用于实时通知和简单消息的发布与订阅。
  4. 分布式特性:

    • ActiveMQ和RocketMQ都是为分布式环境而设计的,支持集群和负载均衡。
    • Redis可以在分布式环境中使用,但其发布订阅功能相对来说较为简单,不如ActiveMQ和RocketMQ在复杂分布式场景下灵活。

总的来说,如果需要一个功能丰富且专注于消息队列模式的消息传递系统,可以选择ActiveMQ或RocketMQ。而如果只需简单的发布订阅功能,Redis的发布订阅是个不错的选择。

Redis从入门到放弃(3):发布与订阅的更多相关文章

  1. Redis 从入门到放弃

    Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/

  2. Redis——从入门到放弃

    redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, ...

  3. Redis源码解析:30发布和订阅

    Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现. 通过执行SUBSCRIBE命令,客户端可以订阅 ...

  4. 【笔记】《Redis设计与实现》chapter18 发布与订阅

    chapter18 发布与订阅 客户端订阅频道. 客户端向频道发送消息, 消息被传递至各个订阅者. 匹配模式 客户端订阅模式. 客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者. 另一个模 ...

  5. 转载RabbitMQ入门(3)--发布和订阅

    发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...

  6. redis从入门到放弃 -> 部署方案

    单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...

  7. redis从入门到放弃 -> 简介&概念

    一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...

  8. 发布 Android Library 到 JCenter 从入门到放弃

    最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史.好,接下来,直奔主题,以下是发布流程. 发布到 JCenter 发布到 JCente ...

  9. Redis快速入门详解

    Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...

  10. Go从入门到放弃

    Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...

随机推荐

  1. 理解 React 中的 useEffect、useMemo 与 useCallback

    useEffect 先理解 useEffect 有助于学习 useMemo 和 useCallback.因为 useMemo 和 useCallback 的实现实际上都是基于 useEffect 的. ...

  2. C++ | 类继承

    1. 概述 C++有3种继承方式:公有继承(public).保护继承(protected).私有继承(private). 一个B类继承于A类,或称从类A派生类B.这样的话,类A称为基类(父类),类B称 ...

  3. Centos7安装JDK1.8详细步骤

    JDK 解压JDK安装文件.在终端中,进入你下载的JDK安装文件所在的目录,然后执行以下命令: tar -zxvf jdk-<版本号>-linux-x64.tar.gz 其中,<版本 ...

  4. .join()字符串操作函数

    join函数是一个字符串操作函数 str.join(item)str表示字符串(字符),item表示一个成员,注意括号里必须只能有一个成员,比如','.join('a','b')这种写法是行不通的 举 ...

  5. uni-app Pages.json配置

    https://uniapp.dcloud.net.cn/collocation/pages.html pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径.窗口样式.原 ...

  6. 局部添加加载中效果loading (vue+elementUI)

    产品需求:有时候我们不想为整个页面添加loading效果.只想给局部区域添加loading效果.(这效果就不揍产品了) 在一个表格数据加载时,因为需要连接其它东西,所以后台接口返回数据需要较长时间,因 ...

  7. vue自定义组件——search-box

    pre { overflow-y: auto; max-height: 300px } github地址: https://github.com/lxmghct/my-vue-components 组 ...

  8. 【Java】Java代码拷贝文件的速度

    Java代码拷贝文件的速度究竟有多快? 前言 最近学习Java到了流处理,其中有种流叫FileInputStream和FileOutputStream,简单来说,就是操作文件的,老师给我们示范了一个非 ...

  9. 基于.NetCore开发博客项目 StarBlog - (28) 开发友情链接相关接口

    前言 之前介绍的友情链接功能,只实现了友情链接的展示和管理接口. 还缺失友情链接申请.审核管理.通知,现在把这块功能补全. Model 什么的之前那篇文章都有,本文直接补全逻辑代码~ 详见: 基于.N ...

  10. SpringBoot整合OSS文件上传

    一.注册阿里云账号并开通OSS服务 1.登录阿里云账号 2.创建一个bucket 3.创建子用户 对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改) 4.配置上传跨域规则 任何来源 ...