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

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

时间:2023-08-03 19:38:14浏览次数:48  
标签:订阅 频道 入门 Redis notifications 发布 消息



文章目录

  • 1、介绍
  • 2、如何使用发布订阅
  • 2.1、订阅频道
  • 2.2、发布消息
  • 2.3、取消订阅
  • 2.4、模式订阅
  • 2.5、取消模式订阅
  • 3、使用案例(伪代码)
  • 4、Redis的发布订阅与ActiveMQ、RocketMQ区别


1、介绍

Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(Pub/Sub)。

发布订阅是一种消息传递模式,它允许消息的发布者(发布者)将消息发送给多个订阅者(订阅者)而不必知道订阅者的存在。这种模式在许多应用中都非常有用,例如实时通知、事件处理、聊天应用等。

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

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的发布订阅是一种发布者-订阅者模式,其中一个消息可以广播给多个订阅者。
  1. 持久性:
  • ActiveMQ和RocketMQ通常支持消息的持久性,可以确保即使在消费者离线的情况下,消息不会丢失。
  • Redis的发布订阅默认不支持持久性。一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;
  1. 功能特性:
  • ActiveMQ和RocketMQ提供了丰富的功能,如消息重试、消息顺序保证、延迟消息等。
  • Redis的发布订阅相对简单,主要用于实时通知和简单消息的发布与订阅。
  1. 分布式特性:
  • ActiveMQ和RocketMQ都是为分布式环境而设计的,支持集群和负载均衡。
  • Redis可以在分布式环境中使用,但其发布订阅功能相对来说较为简单,不如ActiveMQ和RocketMQ在复杂分布式场景下灵活。

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


标签:订阅,频道,入门,Redis,notifications,发布,消息
From: https://blog.51cto.com/u_13693015/6952273

相关文章

  • Redis从入门到放弃(1):安装配置
    文章目录1.介绍2.优势3.安装Redis4.后台运行5.配置Redis5.1查看配置项5.2修改配置项5.3参数说明6.错误解决1.介绍Redis是一个高性能的开源key-value数据库。它被广泛应用于缓存、会话存储、实时分析、消息队列等场景。Redis具有以下三个主要特点:数据持久化:Redis支持......
  • Redis从入门到放弃(2):数据类型
    文章目录1.字符串(String)1.1、介绍1.2、命令示例1.3、注意事项2.哈希(Hash)2.1、介绍2.2、命令示例2.3、注意事项3.列表(List)3.1、介绍3.2、命令示例3.3、注意事项4.集合(Set)4.1、介绍4.2、命令示例5.有序集合(SortedSet)5.1、介绍5.2、命令示例6、总结在Redis中,数据以键值对的形......
  • 怎么设置centos限定redis使用的内存
    1、Redis-Cluster集群2、怎么设置centos限定redis使用的内存3、高性能高并发网站架构,教你搭建Redis5缓存集群4、Redis-Cluster5、「实用教程」在配备持久内存的实例上部署Redis应用Redis-Cluster集群1、连接如下https://redis.io/topics/cluster-tutorial以下步骤是在一......
  • 新一代开源流数据湖平台Apache Paimon入门实操-上
    @目录概述定义核心功能适用场景架构原理总体架构统一存储基本概念文件布局部署环境准备环境部署实战Catalog文件系统HiveCatalog创建表创建Catalog管理表查询创建表(CTAS)创建外部表创建临时表修改表修改表修改列修改水印概述定义ApachePaimon官网https://paimon.apache.org......
  • T4 模板: 为 ASP.NET MVC 开发人员快速入门指南
    http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在中提到我们的最近博客文章,ASP.NETMVC发布候选版,我们的代码生成功能(即,添加控制器和添加视图)现在使用T4(文本模板转换工具包)模板化技术在幕后。因为......
  • elasticsearch集群等概念入门
    欢迎来到Elasticsearch的奇妙世界,它是优秀的全文检索和分析引擎。不管你对Elasticsearch和全文检索有没有经验,都不要紧。我们希望你可以通过这本书,学习并扩展Elasticsearch的知识。由于这本书也是为初学者准备的,我们决定先简单介绍一般性的全文检索概念,接着再简要概述Elasticsearch......
  • Java入门题-百钱买百鸡
    题:100钱买100只鸡,必须满足,钱花完,鸡百只 重点:循环语句来枚举所有可能性 代码:byteplan=1;for(inti=0;i<20;i++){for(inti1=0;i1<34;i1++){for(inti2=0;i2<101;i2++){if(((i*5+i1*3+i2)==100)&&((i+i1......
  • 虹科干货 | DevOps 团队为什么独独青睐 Redis Enterprise ?
    快速部署是保障成功的DevOps的关键要素。虹科RedisEnterprise提供了一种快速的数据库。01DevOps团队面临的挑战1.提高应用程序处理速度,赢得商业竞争许多企业中,DevOps团队(DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合)正......
  • 虹科分享 | 妙招频出,Redis 企业版这样解决缓存问题→
    为什么企业需要数字化?数字化转型的根本目的是什么?数据的缓存为什么如此的重要?虹科RedisEnterprise又能够在哪些方面助力企业解决数据处理难题?01当前数据库缓存面临的挑战:使用当前数据库实现速度和可扩展性实现满足用户期望所需的数据性能并不容易。企业需要应对遗留基础设施、缓......
  • 使用redis-py的两个类Redis和StrictRedis时遇到的坑
    redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。简单说,官方推荐使用StrictRedis方法。  不推荐Redis类,原......