Redis发布订阅以及应用场景介绍

news2024/12/25 2:13:31

目录

    • 一、什么是发布和订阅?
    • 二、Redis的发布和订阅
    • 三、发布和订阅的命令行实现
    • 四、发布和订阅命令
      • 1、subscribe:订阅一个或者多个频道
      • 2、publish:发布消息到指定的频道
      • 3、psubscribe:订阅一个或多个符合给定模式的频道
      • 4、pubsub:查看订阅与发布系统状态
      • 5、punsubscribe:退订所有给定模式的频道
      • 6、unsubscribe:指退订给定的频道
    • 五、Redis发布和订阅缺点
    • 六、Jedis当中实现发布和订阅

一、什么是发布和订阅?

官网介绍:https://redis.com.cn/redis-pub-sub.html

Redis 发布/订阅是一种消息传模式,其中发送者(在Redis术语中称为发布者)发送消息,而接收者(订阅者)接收消息。传递消息的通道称为channel。

Redis的发布和订阅最大的缺点是消息不能持久化!也就是我们通过Redis发送的消息,压根在Redis当中根本没有存。

二、Redis的发布和订阅

在Redis中,客户端可以订阅任意数量的频道。

1、客户端可以订阅频道如下图

2、当给这个频道发布消息后,消息就会发送给订阅的客户端

三、发布和订阅的命令行实现

1、打开一个客户端订阅channel1:

订阅命令: subscribe channel1 channel2 … ,可以订阅多个频道。当执行命令过后只要不终止会一直处于订阅监听状态。

2、打开另一个客户端,给channel1发布消息hello

发标消息命令: publish channel 消息 ,返回值表示有几个订阅者

3、切换到订阅者窗口,可以看到收到信息了

四、发布和订阅命令

1、subscribe:订阅一个或者多个频道

SUBSCRIBE channel [channel ...]

返回值:接收到的信息(请参见下面的代码说明)。

127.0.0.1:6379> subscribe channel1 channel2 # 订阅了两个频道channel1和channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"	# 返回值的类型:显示订阅成功
2) "channel1"	# 订阅的频道名字
3) (integer) 1	# 目前已订阅的频道数量

1) "subscribe"	# 返回值的类型:显示订阅成功
2) "channel2"	# 订阅的频道名字
3) (integer) 2	# 目前已订阅的频道数量

1) "message"	# 返回值的类型:信息
2) "channel1"	# 来源(从那个频道发送过来)
3) "hello"		# 信息内容
1) "message"
2) "channel2"
3) "gagaga"

2、publish:发布消息到指定的频道

PUBLISH channel message

返回值:接收到信息 message 的订阅者数量。

127.0.0.1:6379> publish channel1 hello	# 向有一个订阅者的频道发送信息
(integer) 1
127.0.0.1:6379> publish channel2 gagaga
(integer) 1
127.0.0.1:6379> publish channel3 aaaa # 对没有订阅者的频道发送信息,返回的就是0
(integer) 0

3、psubscribe:订阅一个或多个符合给定模式的频道

PSUBSCRIBE pattern [pattern ...]

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。

# 订阅 news.* 和 tweet.* 两个模式

redis> psubscribe news.* tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" # 返回值的类型:显示订阅成功
2) "news.*" # 订阅的模式
3) (integer) 1 # 目前已订阅的模式的数量
1) "psubscribe"
2) "tweet.*"
3) (integer) 2

1) "pmessage" # 返回值的类型:信息
2) "news.*" # 信息匹配的模式
3) "news.it" # 信息本身的目标频道
4) "Google buy Motorola" # 信息的内容

1) "pmessage"
2) "tweet.*"
3) "tweet.huangz"
4) "hello"

1) "pmessage"
2) "tweet.*"
3) "tweet.joe"
4) "@huangz morning"

1) "pmessage"
2) "news.*"
3) "news.life"
4) "An apple a day, keep doctors away"

4、pubsub:查看订阅与发布系统状态

(1)列出当前的活跃频道:PUBSUB CHANNELS [pattern]
活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内。也就是通过psubscribe订阅的不在内。

pattern 参数是可选的:

  • 如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。
  • 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
127.0.0.1:6379> PUBSUB CHANNELS
1) "channel2"
2) "channel1"
127.0.0.1:6379> PUBSUB CHANNELS channel3 # 频道没有人订阅返回就是空
(empty list or set)
127.0.0.1:6379> PUBSUB CHANNELS channel1 # 只要有人订阅就返回频道名称
1) "channel1"
127.0.0.1:6379> PUBSUB CHANNELS channel* # 返回channel相关的活跃频道
1) "channel2"
2) "channel1"

(2)返回给定频道的订阅者数量, 通过PSUBSCRIBE 订阅的不统计在内:PUBSUB NUMSUB [channel-1 ... channel-N]

127.0.0.1:6379> pubsub numsub channel1
1) "channel1"	# 频道名称
2) (integer) 2  # 订阅数量
127.0.0.1:6379> pubsub numsub aa1
1) "aa1"
2) (integer) 0 # 不存在返回0

(3)返回订阅模式的数量,也就是使用PSUBSCRIBE 订阅的:PUBSUB NUMPAT

5、punsubscribe:退订所有给定模式的频道

punsubscribe其实就是对应的psubscribe。

PUNSUBSCRIBE [pattern [pattern ...]]

如果没有模式被指定,也即是,一个无参数的 PUNSUBSCRIBE 调用被执行,那么客户端使用 PSUBSCRIBE 命令订阅的所有模式都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的模式。

6、unsubscribe:指退订给定的频道

UNSUBSCRIBE [channel [channel ...]]

如果没有频道被指定,一个无参数的 UNSUBSCRIBE 调用被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。

像unsubscribe和punsubscribe两个退订的命令是只退订当前客户端的,我们通过windows的客户端其实是不好测的,因为我们一旦开启订阅后,客户端会进入监听状态,我们根本没法输入别的命令。所以这些命令往往都是框架当中才可以测试。

五、Redis发布和订阅缺点

PubSub 的生产者传递过来一个消息,Redis 会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。

如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息直接被丢弃。

正是因为 PubSub 有这些缺点,它几乎找不到合适的应用场景。所以 Redis 的作者单独开启了一个项目 Disque 专门用来做多播消息队列。该项目目前没有成熟,一直长期处于Beta 版本,但是相应的客户端 sdk 已经非常丰富了,就待 Redis 作者临门一脚发布一个Release 版本。关于 Disque 的更多细节,本小册不会多做详细介绍,感兴趣的同学可以去阅读相关文档。

六、Jedis当中实现发布和订阅

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>4.4.1</version>
</dependency>

实际开发的时候发送者和接受者肯定不会在一个线程内,我这里也只是做简单的练习。

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPubSub;

public class RedisPubSub {
    public static void main(String[] args) {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        // 连接池最大连接数
        genericObjectPoolConfig.setMaxTotal(20);
        // 创建redis连接池
        JedisPool pool = new JedisPool(genericObjectPoolConfig, "127.0.0.1", 6379, 2000, "123456");


        // JedisPubSub是jedis提供的一个消息处理抽象类,在通过Jedis.subscribe的时候可以绑定
        JedisPubSub pubSub = new JedisPubSub() {
            // 接受到消息的时候会访问
            @Override
            public void onMessage(String channel, String message) {
                System.out.println("received message:" + channel + " -" + message);
            }

            // 开启监听的时候会访问
            @Override
            public void onSubscribe(String channel, int subscribedChannels) {
                System.out.println("subscribed channel:" + channel);
            }
        };

        Thread t = new Thread(() -> {
            Jedis jedis = pool.getResource();
            // 监听cece通道的消息
            jedis.subscribe(pubSub, "cece");
            jedis.close();
        });
        t.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        Jedis jedis = pool.getResource();
        // 向cece通道发送消息
        Long publish = jedis.publish("cece", "test_info");
        System.out.println(publish);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过facebook主页进行自己产品的推广可行吗?

首先&#xff0c;让我们明确结论&#xff1a;通过Facebook主页进行产品推广是可行的&#xff0c;但并不是必要的。为什么这么说呢&#xff1f; Facebook作为一个社交平台&#xff0c;其核心功能是连接人与人之间的关系&#xff0c;鼓励用户分享和互动。用户在Facebook上的活动主…

(学习日记)2023.04.23

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

实用可靠的安科瑞电动机保护控制器的应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;介绍了一种新型电动机保护器&#xff0c;兼有电流、电压、过载、短路保护功能。它集电流型和电压型电动机保护器优点于一身&#xff0c;对电源欠电压、过电压、断相起闭锁作用&#xff0c;它结构简单…

【测试报告】个人博客系统自动化测试报告

文章目录 项目背景项目功能测试计划功能测试测试用例执行测试的操作步骤 自动化测试设计的模块、自动化运行的结果、问题定位的结果自动化测试优点 项目背景 对于一个程序员来说&#xff0c;定期整理总结并写博客是不可或缺的步骤&#xff0c;不管是对近期新掌握的技术或者是遇…

C# 读取json格式文件

读取json格式文件 安装 Newtonsoft.Json 程序集 1. 选择界面下方的【程序包管理器控制台】页面&#xff0c;输入安装指令 Install-Package Newtonsoft.Json 2. 安装完成后&#xff0c;请确保在代码文件的顶部包含以下 using 指令&#xff1a; using Newtonsoft.Json; 创建读…

GCC如何生成并调用静态库

一&#xff0c;简介 本文主要介绍如何使用gcc编译代码生成静态库&#xff0c;并调用静态库运行的操作步骤。 二&#xff0c;准备工作 使用add.c和main.c生成test可行性文件的流程图&#xff1a; add.c文件的内容&#xff1a; #include "add.h"int add(int a, i…

自学网络安全, 一般人我劝你还是算了吧

前言&#xff1a;自学我劝你还是算了&#xff0c;我为什么要劝你放弃我自己却不放弃呢&#xff1f;因为我不是一般人。。。 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 …

【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入&#xff0c;我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段&#xff0c;需要在每个版本中&#xff0c;对某些新增接口进行性能测试&#xff0c;有时还需要在一天中的不同时段分别进行…

计算如何与实验结合发Science

理论计算与实验结合的研究已经成为TOP期刊中的主流方式。近日&#xff0c;上海交通大学种丽娜副教授一项关于质子交换膜水解槽阳极催化剂的研究成果在Science发表。该工作报道了一种由沸石甲基咪唑酯骨架&#xff08;Co-ZIF&#xff09;衍生并通过静电纺丝处理的镧和锰共掺杂的…

Python 修复共享内存问题和锁定共享资源问题

文章目录 使用 multiprocessing.Array() 在 Python 中使用共享内存解决多进程之间共享数据问题的解决方案 使用 multiprocessing.Lock() 锁定 Python 中的共享资源 本篇文章解释了多处理共享内存的不同方面&#xff0c;并演示了如何使用共享内存解决问题。 我们还将学习如何使用…

Axure教程—图片手风琴效果

本文将教大家如何用AXURE制作图片手风琴效果 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://6nvnfm.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87847313?spm1001.2014.3001.5501 二、功能介绍 图片自动播放为手风…

MT4交易外汇平台有哪些优势?为何是外汇投资首选?

外汇市场上存在着各种各样的外汇交易商&#xff0c;但是很多的外汇交易商所选择的交易平台都是MT4交易外汇平台。作为全世界范围内使用最为广泛的交易平台&#xff0c;MT4交易外汇平台具有哪些优势&#xff0c;能够让外汇交易商和外汇投资者都选择使用。本文就来具体的聊聊&…

SQL中not in的一个坑

因not in 效率较低&#xff0c;在工作用一只用left join代替&#xff0c;在某一次查询使用了not in发现&#xff0c;结果为空&#xff0c;sql大致如下 select id from table1 where id not in (select id from table2)经过查询发现select id from table2里面的id有null值导致该…

司法大数据解决方案

2018年11月26日&#xff0c;司法部制定了《智慧监狱技术规范SFT0028-2018》并于2019年1月1日正式颁布实施&#xff0c;要求智慧监狱的建设应者眼于监狱工作实际&#xff0c;将物联网、云计算、大数据、人工智能等新一信息技术与监狱各项业务深度融合&#xff0c;形成标准规范科…

论文解读 | 基于改进点对特征的点云6D姿态估计

原创 | 文 BFT机器人 01 摘要 点对特征(PPF)方法已被证明是一种有效的杂波和遮挡下的姿态估计方法。 文章的改进方法主要包括: (1)一种基于奇偶规则求解封闭几何的法向的方法; (2)通过将体素网格划分为等效角度单元的有效降采样方法; (3)基于拟合点的验证步骤。在真实杂波数据集…

如何挖掘360下拉词,怎么删除360下拉负面词

大多数人的手机或者电脑上都安装了360浏览器&#xff0c;360搜索APP等&#xff0c;安装的用户量大&#xff0c;自然使用的用户也就多了&#xff0c;360下拉的优势就展现出来了&#xff0c;展示量大&#xff0c;全国各地均可见&#xff1b;能够引流来的都是相对精准的目标用户&a…

C#简单数据结构类和常用泛型结构类

文章目录 1.简单数据结构类&#xff08;1&#xff09;动态数组Arraylist&#xff08;2&#xff09;栈Stack&#xff08;3&#xff09;队列Queue&#xff08;4&#xff09;哈希表Hashtable 2.泛型3.常用泛型数据结构类&#xff08;1&#xff09;列表List&#xff08;2&#xff0…

高完整性系统:Fault Tolerant Design

目录 1. INTRODUCTION TO FAULT TOLERANCE 1.2 Definitions 1.3 Two Kinds of Faults 1.4 Hardware vs Software Faults 1.4.1 Failure Curve for Hardware 1.4.2 Hardware and Software Failures 1.5 Causes of Failures 1.6 3 Ways to Class Failures 1.6.1 Tempora…

Java 岗史上最全八股文面试真题汇总,堪称 2023 年面试天花板

前言 现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。金九银十招聘黄金季已经来临&#xff01;大家在考研和找工作中纠结的时候&#xff0c;不妨先看一下面试题&#xff0c;毕竟我们的最终目标就是为了找一份心仪…

机器视觉怎么对陶瓷板外观尺寸进行自动检测?

随着陶瓷行业的发展&#xff0c;陶瓷板的生产和质量控制面临越来越高的要求。而机器视觉技术作为一种高精度、高效率、无损、可靠性高的自动化检测手段&#xff0c;已经成为陶瓷板外观尺寸自动化检测的首选方案。本文就如何利用机器视觉对陶瓷板外观尺寸进行自动检测进行分析和…