滚雪球学Redis[6.4讲]:Redis消息队列:构建高效的消息通信与任务调度系统
全文目录:
- 🎉前言
- 🚦Redis消息队列的使用场景
- 🐳1. 异步任务处理
- 🐋2. 任务调度
- 🐬3. 模块解耦
- ⚙️实现发布/订阅模型
- 🐟️1. 发布者发布消息
- 🐠2. 订阅者订阅频道
- 🐡3. 实际应用案例
- 🧩使用List实现队列与任务调度
- 🦈1. 任务入队(生产者)
- 🐙2. 任务出队(消费者)
- 🦋任务调度系统的示例
- 🔧下期预告
🎉前言
在上一期【6.3 Redis分布式锁】的内容中,我们深入探讨了如何利用Redis实现分布式锁机制来解决多节点系统中的并发资源争用问题。我们通过学习Redis的SETNX
、EXPIRE
等命令,了解了如何在实际开发中应用分布式锁以保证数据的一致性与安全性。分布式锁可以帮助我们防止多个进程同时修改同一资源,从而避免了潜在的竞争条件。
然而,在分布式系统中,除了资源的并发控制,系统各模块间的高效通信和异步任务处理同样至关重要。当系统需要处理大量请求时,如何确保不同组件能够以解耦的方式进行通信和任务处理?这就是我们今天要探讨的内容——Redis消息队列。
消息队列不仅是高效处理任务的利器,还可以帮助系统组件在不直接相互依赖的情况下进行异步通信,从而提高系统的扩展性、容错性和性能表现。今天的文章将详细讲解Redis消息队列的实现原理及其使用场景,并带领大家一步步实现发布/订阅模型和基于List
的任务调度系统。
🚦Redis消息队列的使用场景
Redis消息队列可以帮助系统实现异步消息传递、任务调度和模块解耦。在很多高并发系统中,使用消息队列可以有效地提高系统的吞吐量和响应速度。具体场景包括但不限于以下几个方面:
🐳1. 异步任务处理
很多系统操作不需要即时处理,尤其是一些耗时较长的任务,例如用户注册后的邮件发送、生成报告、数据分析等。这些任务可以通过消息队列放入队列中,等待系统有空闲资源时再处理,避免阻塞主线程。
示例:
在电商系统中,用户下单后,系统不需要立即同步更新库存或发送确认邮件。我们可以将这些任务放入消息队列,由专门的后台任务处理系统异步执行,提升用户的下单体验。
🐋2. 任务调度
Redis通过其数据结构List
可以轻松实现先进先出的任务调度机制。我们可以将不同优先级的任务按照顺序插入队列中,系统根据任务的优先级依次处理,避免任务处理混乱。
示例:
在视频处理平台中,用户上传视频后需要进行转码和生成缩略图等操作。我们可以使用Redis消息队列将视频处理任务进行调度,将转码任务、生成缩略图等任务按照优先级加入到队列中,确保资源合理分配。
🐬3. 模块解耦
使用消息队列,系统不同模块可以通过消息的方式进行通信,而无需直接依赖彼此。这样不仅降低了模块之间的耦合度,还可以提高系统的灵活性和扩展性。
示例:
在微服务架构中,各个服务之间可以通过Redis消息队列进行通信。一个服务只需将消息发布到队列中,其他服务通过订阅队列获取消息并处理。这种方式可以有效解耦服务,使得各服务独立开发、部署和扩展。
⚙️实现发布/订阅模型
Redis原生支持的发布/订阅(Pub/Sub)模型非常适合消息传递场景。发布者可以将消息发布到指定的频道,订阅者只要订阅了该频道,就能接收到发布的消息。这种模式非常适合实时通信系统,例如消息推送、在线聊天等场景。
🐟️1. 发布者发布消息
发布者可以通过PUBLISH
命令将消息发布到某个频道。例如,将一条文本消息发布到名为news
的频道:
PUBLISH news "Breaking news: Redis is awesome!"
🐠2. 订阅者订阅频道
订阅者使用SUBSCRIBE
命令订阅频道,一旦有消息发布到该频道,订阅者将立即接收到消息。例如,订阅news
频道:
SUBSCRIBE news
通过这种方式,多个订阅者可以同时监听同一频道,收到相同的消息,而发布者则只需向一个频道发布消息,不需要关心有多少订阅者。这大大简化了发布和接收消息的逻辑,使得消息传递更加高效和灵活。
🐡3. 实际应用案例
一个新闻推送系统可以通过Redis的发布/订阅模式来实现。假设我们有一个新闻发布平台,新闻编辑通过管理后台发布最新消息,前端网页可以通过订阅频道即时接收到推送的新闻内容,显示在用户的浏览器中:
# 发布者(新闻编辑)
PUBLISH news_channel "Breaking News: New Redis Version Released!"
# 订阅者(前端用户)
SUBSCRIBE news_channel
当新闻发布后,所有订阅了news_channel
的用户都会立即收到这条新闻消息。
🧩使用List实现队列与任务调度
除了发布/订阅模型,Redis的List
数据结构可以用来构建一个简单的消息队列系统。与发布/订阅不同的是,使用List
可以确保消息持久化在队列中,消费者可以异步地取出并处理消息,从而实现任务调度。
🦈1. 任务入队(生产者)
使用LPUSH
命令将任务放入队列的头部。例如,将多个任务加入到名为task_queue
的队列中:
LPUSH task_queue "Task 1"
LPUSH task_queue "Task 2"
LPUSH task_queue "Task 3"
🐙2. 任务出队(消费者)
使用RPOP
命令从队列的尾部取出任务并执行。例如,消费者从task_queue
队列中获取任务并处理:
RPOP task_queue
通过这种方式,多个消费者可以并发地从队列中取出任务并处理,实现了任务的高效调度。
🦋任务调度系统的示例
假设我们有一个订单系统,用户下单后,系统需要执行多个后续任务,如发送订单确认邮件、更新库存、生成发票等。我们可以使用Redis队列来实现任务调度,让每个任务异步处理,从而避免阻塞主线程,提高系统响应速度。
# 生产者将任务加入队列
LPUSH order_queue "Send Email to User 123"
LPUSH order_queue "Update Inventory for Order 456"
LPUSH order_queue "Generate Invoice for Order 789"
# 消费者从队列中取出任务并处理
RPOP order_queue # 处理任务:"Send Email to User 123"
RPOP order_queue # 处理任务:"Update Inventory for Order 456"
RPOP order_queue # 处理任务:"Generate Invoice for Order 789"
🔧下期预告
在下一期【7.1 使用Redis实现会话管理】中,我们将详细讲解如何利用Redis来实现Web应用中的会话管理,讨论会话过期与刷新策略,并探讨在高并发和大规模用户访问场景中的安全性优化。接下来的章节【7.2 使用Redis实现缓存系统】将进一步介绍Redis在缓存系统中的应用,探索如何通过Redis构建高效的缓存层来提升系统性能。敬请期待!
相关文章:
滚雪球学Redis[6.4讲]:Redis消息队列:构建高效的消息通信与任务调度系统
全文目录: 🎉前言🚦Redis消息队列的使用场景🐳1. 异步任务处理🐋2. 任务调度🐬3. 模块解耦 ⚙️实现发布/订阅模型🐟️1. 发布者发布消息🐠2. 订阅者订阅频道🐡3. 实际应…...

《计算机视觉》—— 换脸
效果如下: 完整代码: import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…...

【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)
前言 🌟🌟本期讲解关于CAS的补充和JUC中有用的类,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&…...
复习:react 中的 refs,怎么使用,有哪些使用场景
在 React 中,refs(引用)是一个重要的特性,它允许开发者直接访问 DOM 元素或者 React 组件的实例。以下是对 React 中 refs 的使用及其使用场景的详细解释: 一、refs 的使用方法 字符串引用 在早期的 React 版本中,可以通过字符串来设置 ref。然而,这种方法已经被废弃,…...

Python OpenCV精讲系列 - 目标检测与识别深入理解(二十)
💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识…...
golang中的上下文
背景 在Go语言中,使用context包来管理跨API和进程间的请求生命周期是常见的做法。特别是在涉及到并发编程时,如启动协程(goroutine)来处理异步任务,正确地传递和监听context变得尤为重要。比如,在gin框架中…...

Navigation2 算法流程
转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序,执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能,本文件…...
OpenAI swarm+ Ollama快速构建本地多智能体服务 - 1. 服务构建教程
OpenAI开源了多智能体编排的工程swarm,今天介绍一下swarm与OLLAMA如何结合使用的教程,在本地构建自己的多智能体服务,并给大家实践演示几个案例。 安装步骤 安装ollama,在官网下载对应操作系统的版本即可,下载后用ol…...
HTB:Wifinetic[WriteUP]
目录 连接至HTB并启动靶机 1.What is the name of the OpenWRT backup file accessible over FTP? 使用nmap对靶机21、22端口进行脚本、服务信息扫描 2.Whats the WiFi password for SSID OpenWRT? 3.Which user reused the WiFi password on thier local account? 4.…...

专业学习|马尔可夫链(概念、变体以及例题)
一、马尔可夫链的概念及组成 (一)学习资料分享 来源:024-一张图,但讲懂马尔可夫决策过程_哔哩哔哩_bilibili 马尔可夫链提供了一种建模随机过程的方法,具有广泛的应用。在实际问题中,通过转移概率矩阵及初…...
RK3576 安卓SDK编译环境搭建
编译 Android14 对机器的配置要求较高: 建议预留500G存储 多分配CPU和内存 建议使用 Ubuntu 20.04 操作系统或更高版本 sudo apt-get updatesudo apt-get install make gcc sudo apt-get install g++ patchelf gawk texinfo chrpath diffstat binfmt-support sudo apt-get …...

Renesas R7FA8D1BH (Cortex®-M85) 上光电编码器测速功能
目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 测速功能原理介绍 2.2.1 理论描述 2.2.2 实现原理 2.2.3 系统硬件结构 3 软件实现 3.1 FSP配置项目 3.2 代码实现 3.2.1 初始化函数 3.2.2 功能函数 3.…...

软件测试学习笔记丨Linux三剑客-sed
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32521 一、简介 sed(Stream editor)是一个功能强大的文本流编辑器,主要用于对文本进行处理和转换。它适用于自动化处理大量的文本数据,能够支持…...

Vue脚手架学习 vue脚手架配置代理、插槽、Vuex使用、路由、ElementUi插件库的使用
目录 1.vue脚手架配置代理 1.1 方法一 1.2 方法二 2.插槽 2.1 默认插槽 2.2 具名插槽 2.3 作用域插槽 3.Vuex 3.1 概念 3.2 何时使用? 3.3 搭建vuex环境 3.4 基本使用 3.5 getters的使用 3.6 四个map方法的使用 3.6.1 mapState方法 3.6.2 mapGetter…...
使用yml文件安装环境时,如何添加conda和pip的镜像源
博客参考 添加conda镜像源 name: NAME channels:- conda-forge- pytorch- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2- defaults depende…...

c语言经典100例
1.字符串转为数字 #include <stdio.h>int strToInt(char *s) {int num0;int sign1;int step1;if (*s -){sign -1;s;}while (*s > 0&&*s < 9){num num*10(*s-0);step 10;s;}return num*sign; }int main() {char a[10] "-1234";char *s a ;pr…...

百易云资产管理运营系统 ufile.api.php SQL注入漏洞复现
0x01 产品描述: 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能&#…...
【分布式微服务云原生】《Redis RedLock 算法全解析:应对时钟漂移与网络分区挑战》
《Redis RedLock 算法全解析:应对时钟漂移与网络分区挑战》 摘要: 本文深入探讨 Redis 的 RedLock 算法,详细阐述其步骤及工作原理,同时重点分析该算法如何处理时钟漂移和网络分区这两个常见的分布式系统问题。读者将通过本文深入…...

OceanBase 的写盘与传统数据库有什么不同?
背景 在数据库开发过程中,“写盘”是一项核心操作,即将内存中暂存的数据安全地转储到磁盘上。在诸如MySQL这样的传统数据库管理系统中,写盘主要有以下几步:首先将数据写入缓存池;其次,为了确保数据的完整性…...

用Java爬虫API,轻松获取taobao商品SKU信息
在电子商务的世界里,SKU(Stock Keeping Unit,库存单位)是商品管理的基础。对于商家来说,SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一,提供…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...