什么是redis发布订阅模式,并用java代码实现小demo

news/2024/12/28 16:07:42/

Redis中的发布订阅模式是一种消息传递模式,其中订阅者通过订阅特定的频道(channel)来接收发布者发送的消息。发布者将消息发送到指定的频道,所有订阅该频道的订阅者都会收到相同的消息。 发布订阅模式主要应用于实时数据处理、消息推送、日志处理等场景,其中需要实时将数据传递给多个客户端,且客户端不需要响应发布者的请求。

Redis中的发布订阅模式一种多路复用技术,用于处理异步事件和订阅者/发布者模式。它允许多个客户端同时订阅同一个频道,并在该频道上获取相关的事件通知。这种模式在以下场景中特别有用:

  1. 处理长轮询(polling)场景:Redis通过发布订阅模式,实现了长轮询场景下的高效性能。当一个客户端订阅了一个频道后,它可以在该频道上设置一个过期时间,在该时间内不需要再轮询数据,而是等待事件发布。这样,当频道有事件发生时,Redis会立即得到通知,从而实现高效的数据获取。

  2. 实现分布式系统中的订阅者/发布者模式:在分布式系统中,多个客户端可能需要同时订阅同一个频道,以便在该频道上获取相关的事件通知。通过发布订阅模式,Redis可以轻松地实现这种模式,保证每个客户端都能够获取到最新的事件通知。

为了模拟发布订阅模式,可以使用Redis的命令模式来实现。以下是一个示例命令:

  1. 启动Redis服务,并启动两个客户端(分别代表发布者和订阅者)。

  2. 在发布者客户端中使用PUBLISH命令向指定频道发布消息。例如,向频道“news”发布一条消息:

PUBLISH news "Hello, World!"

3.在订阅者客户端中使用SUBSCRIBE命令订阅指定频道。例如,订阅频道“news”:

SUBSCRIBE news

此时,发布者客户端发布的消息会被订阅者客户端接收到并打印出来。

使用java代码实现一下Redis中的发布订阅模式

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisPubSubExample {public static void main(String[] args) {// 创建Jedis对象Jedis jedis = new Jedis("localhost", 6379);// 创建订阅者JedisPubSub subscriber = new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {// 处理订阅到的消息System.out.println("Received message: " + message + " from channel: " + channel);}};// 订阅频道jedis.subscribe(subscriber, "news");// 在另一个线程中发布消息new Thread(() -> {try {Thread.sleep(1000);jedis.publish("news", "Hello, World!");} catch (InterruptedException e) {e.printStackTrace();}}).start();// 等待接收消息try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 取消订阅subscriber.unsubscribe();// 关闭Jedis连接jedis.close();}
}

在上述示例中,创建了一个Jedis对象,用于连接Redis服务。然后,创建了一个订阅者对象,并通过Jedis的subscribe()方法订阅了名为“news”的频道。在另一个线程中,使用Jedis的publish()方法向“news”频道发布了一条消息。当订阅者接收到消息后,会通过onMessage()方法进行处理。最后,通过unsubscribe()方法取消订阅,并关闭Jedis连接。


http://www.ppmy.cn/news/50559.html

相关文章

streamx平台部署

一. streamx介绍 StreamPark 总体组件栈架构如下, 由 streampark-core 和 streampark-console 两个大的部分组成 , streampark-console 是一个非常重要的模块, 定位是一个综合实时数据平台,流式数仓平台, 低代码 ( Low Code ), Flink & Spark 任务托…

在线图片编辑网站汇总

目录 前言一、在线抠图工具1. 佐糖2. remove.bg3. Clipping Magic4. 起兮深深5. BgSub6. 改图神器7. PIXLR 二、其他工具1. 压缩图2. AI人工智能图片放大 前言 本文收录了多个可以在线抠图、在线编辑图片的网站。 一、在线抠图工具 1. 佐糖 官网:链接 特点&#x…

搭建一个简单的react router工程

1.创建一个新的 React 工程:可以使用 create-react-app 脚手架工具来快速创建一个新的项目,命令行输入 npx create-react-app my-app 即可创建一个名为 my-app 的新项目。 2.安装 react-router-dom 库:在命令行中运行 npm install react-rou…

Adobe国际认证证书有用吗?

Adobe国际认证又称为Adobe认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 该体系基于Adobe核心技术及岗位实际应用操作能力的测评体系得到国际ISTE协会的认可,并在全球 148 各国家推广&#x…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题,把缺陷填补掉,提高亮区面积; 腐蚀用来处理毛刺问题,把毛刺腐蚀掉,降低亮区面积。 腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。 膨胀…

【具体到每一步】从0制作一个uniapp的新闻类页面(界面篇)

目录 项目初始化 / 基础配置 项目创建 配置路由/页面/tabbar pages.json配置tabbar 配置图标/静态资源 导航栏和字体颜色 scroll-view实现横向滚动条样式 公共模块定义components组件 新建组件 使用组件 组件里的结构 布局个人中心页面 组件差异化处理 数据传递 导航…

成基于时间轮实现的定时器解决方案

文章目录 定时器的使用场景定时器与其他组件的关系定时器与网络事件在一个线程定时器与网络事件在不同线程当中处理大量定时任务怎么处理 定时器设计接口设计数据结构的抉择 时间轮时间轮的概念设计单层级时间轮1、时间轮大小2、时间精度 空推进问题多层时间轮 Skynet定时器实现…

vim small trick

一下配置都是在IDEA环境下运行的 R和E可以在IDEA窗口间切换如何交换两行 ddp跳到某一行 {number}Gcw 删除某词并切换到插入模式f{character} find 后面的第一个character,; 重复查找上次 f{char} 搜到的字符,, 可以往回重复查找F{character} Forword 找到…