首页 > 数据库 >Redis从入门到放弃(3):发布与订阅

Redis从入门到放弃(3):发布与订阅

时间:2023-07-28 10:45:56浏览次数:45  
标签:订阅 频道 入门 Redis notifications 发布 消息

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,notifications,发布,消息
From: https://www.cnblogs.com/myshare/p/17586966.html

相关文章

  • docker-部署redis
    第一步:pull一个redis最新镜像Dockerpullredis第二步:启动一个主redis容器端口6379+挂载dockerrun--restart=always--log-optmax-size=100m--log-optmax-file=2-p6379:6379--nameredis-master-v/DockerContainerProperties/redis/redis-master.conf:/etc/redis......
  • 实时嵌入式Linux设备基准测试快速入门4测试和测量
    本章将介绍主要测试方案及其具体配置和结果。在介绍实际测量结果之前,将尽可能总结被测设备的特性。最后,将对结果进行分析,并概述由于高速缓存一致性问题造成的延迟方面的主要瓶颈,提出减少延迟的解决方案,并解释用于发现和缓解问题的方法。设备用于智能设备的SABRE板实际参与所......
  • Redis 简介
    1、问题:2、Redis介绍2.1 redis是什么?2.2那Redis不是什么?2.3 Redis性能:2.4 Redis的功能:3、数据结构3.1Key3.2String3.3Hash3.4List3.5Set3.6SortedSet3.7事务3.8过期数据清除4、redis排序简介4.1 以下是对list按key排序的示例:4.2 一般SORT用法4.3 ......
  • Redis 持久化
    RDB快照(RedisDataBase)RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。开启RDB持久化方式开启RDB持久化方式很简单,客户端可以通过向Redis服......
  • ubuntu22 redis 6.0.16
    一、安装下载安装更新软件库aptupdate下载安装sudoaptinstallredis-server-y查看是否运行sudosystemctlstatusredis-serverActive:active(running)sinceFri2023-05-1912:56:25CST;3min19sago测试redis-cli127.0.0.1:6379>keys*(emptyarray)exit二、配置配......
  • python教程 入门学习笔记 第2天 第一个python程序 代码规范 用默认的IDLE (Python GUI
    四、第一个python程序1、用默认的IDLE(PythonGUI)编辑器编写2、在新建文件中写代码,在初始窗口中编译运行3、写完后保存为以.py扩展名的文件4、按F5键执行,在初始窗口观看运行结果5、代码规范:1)先保存再执行2)一句代码单独占一行3)语法中的符号,必须使用英文4)代码前面不能有......
  • Redis 主从同步原理
    一、什么是主从同步?主从同步,就是将数据冗余备份,主库(Master)将自己库中的数据,同步给从库(Slave)。从库可以一个,也可以多个,如图所示:二、为什么需要主从同步?Redis虽然有RDB和AOF持久化技术,可以在服务器重启的情况下保证内存中的数据不会丢失(但不意味着数据不丢,重启的时候还是......
  • linux shell编程入门
    摘要介绍shell是什么shell快速开始一、基本概念1.shell是什么Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序用户可以用Shell来启动、挂起、停止甚至是编写一些程序。2.shell脚本|执行方式脚本格式要求脚本以#!/b......
  • C++入门到放弃(04)——类的访问权限:public、private、protected
    1.成员访问权限假定以下类:classBase{public://constructfunctionBase(inta=0,intb=0,intc=0):m_public(),m_protected(),m_private(){}intm_public;voidpublic_fun(){cout<<m_public<<endl;}protected:intm_prote......
  • Java 连接redis at java.io.FilterOutputStream.flush(FilterOutputStream.java:1
    了解RedisRedis(REmoteDIctionaryServer)是一个开源的、基于内存的数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis提供了丰富的功能和高性能的数据操作,使其成为一个流行的数据库和缓存解决方案。Redis提供了多种语言的客户端库,使开发人员......