Redis学习打卡-Day4-Redis实现消息队列
Redis 基于阻塞队列实现秒杀的优化
- 新增秒杀优惠券的同时,将优惠券信息保存到 Redis 中。
- 基于 Lua 脚本,判断秒杀库存、一人一单,决定用户是否抢购成功。
- 如果抢购成功,将优惠券id和用户id封装后存入阻塞队列。
- 开启独立线程任务,不断从阻塞队列中获取信息,实现异步下单功能。
消息队列(Message Queue)
角色
- 消息队列:存储和管理消息,也被称为消息代理(Message Broker)。
- 生产者:发送消息到消息队列。
- 消费者:从消息队列获取消息并处理消息。
Redis 实现消息队列的方式
- list结构:基于 List 结构模拟消息队列。
- Pubsub:基本的点对点消息模型。
- Stream:比较完善的消息队列模型。
基于 List 结构模拟消息队列
- Redis 的 List 数据结构是一个双向链表,很容易模拟出队列效果。
- 队列的入口和出口不在一边,因此我们可以利用
LPUSH
结合RPOP
、或者RPUSH
结合LPOP
来实现。 - 不过要注意的是,当队列中没有消息时 RPOP 或 LPOP 操作会返回 null,并不像 JVM 的阻塞队列那样会阻塞并等待消息。因此这里应该使用
BRPOP
或者BLPOP
来实现阻塞效果。 - 优点:
- 利用 Redis 存储,不受限于JVM内存上限。
- 基于 Redis 的持久化机制,数据安全性有保证。
- 可以满足消息有序性。
- 缺点:
- 无法避免消息丢失。
- 只支持单消费者。
基于 PubSub 的消息队列
- PubSub(发布订阅)是 Redis2.0 版本引入的消息传递模型。顾名思义,消费者可以订阅一个或多个 channel,生产者向对应channel发送消息后,所有订阅者都能收到相关消息。
SUBSCRlBE channel [channel]
:订一个或多个频道。PUBLISH channel msg
:向一个频道发送消息。PSUBSCRIBE pattern[pattern]
:订阅与pattern格式匹配的所有频道。
- 优点:
- 采用发布订阅模型。
- 支持多生产、多消费。
- 缺点:
- 不支持数据持久化。
- 无法避免消息丢失。
- 消息堆积有上限,超出时数据丢失。
基于 Stream 的消息队列
- Stream 是 Redis 5.0 引入的一种新数据类型,可以实现一个功能非常完善的消息队列。
- 发送消息:
- 读取消息:
- 消息可回溯。
- 一个消息可以被多个消费者读取。
- 这里我们可以循环调用XREAD的阻塞方式来查询最新消息,从而实现持续监听队列的效果。
- 当我们指定起始 ID 为 $ 时,代表读取最新的消息,如果我们处理一条消息的过程中,又有超过1条以上的消息到达队列,则下次获取时也只能获取到最新的一条,会出现漏读消息的问题。
- 消费者组(Consumer Group)
- 将多个消费者划分到一个组中,监听同一个队列。
- 消息分流:队列中的消息会分流给组内的不同消费者,而不是重复消费,从而加快消息处理的速度。
- 消息标示:消费者组会维护一个标示,记录最后一个被处理的消息。哪怕消费者宕机重启,还是会从标示之后读取消息,确保每一个消息都会被消费。
- 消息确认:消费者获取消息后,消息处于pending状态,并存入一个pending-list。当处理完成后需要通过
XACK
来确认消息,标记消息为已处理,才会从pending-list移除。
相关文章:
Redis学习打卡-Day4-Redis实现消息队列
Redis 基于阻塞队列实现秒杀的优化 新增秒杀优惠券的同时,将优惠券信息保存到 Redis 中。基于 Lua 脚本,判断秒杀库存、一人一单,决定用户是否抢购成功。如果抢购成功,将优惠券id和用户id封装后存入阻塞队列。开启独立线程任务&a…...
探索C++面向对象:从抽象到实体的元规则(上篇)
前引:在计算机科学的浩瀚星空中,面向对象编程(OOP) 无疑是照亮现代软件开发的核心范式。而 C 作为一门兼具高性能与抽象能力的系统级语言,其类与对象的语法设计更是开发者构建复杂系统的“元规则”。你是否曾困惑于 封…...
华为鸿蒙电脑发布,企业运营效率可以提高吗?
今日,科技圈迎来重磅消息,华为于19日在成都正式发布两款鸿蒙电脑,标志着鸿蒙操作系统首次登陆电脑端,这是中国国产操作系统的重大里程碑,更是中国电子信息产业自主可控进程中的关键一步。 鸿蒙操作系统作为首个统一移动…...
遨游科普:三防平板是什么?应用在什么场景?
在数字化转型的浪潮中,智能终端设备正从消费级市场向工业级场景深度渗透。传统平板电脑虽能满足日常需求,却难以应对极端环境下的挑战——暴雨、沙尘、震动、高温或低温等恶劣条件,往往成为数据采集、实时通讯和作业效率的“绊脚石”。在此背…...
图像中紫边出现原因
一、紫边 在实景调试中,我们经常会遇到高亮场景下的物体边缘分布有明显的紫边(purple fringe)现象, 就如下图所示: 对于紫边的成因,通常认为是镜头色差(镜头对不同光谱光线的折射程度不同,导致不…...
中服云生产线自动化智能化调度生产系统:打造智能制造新标杆
前言 在当今制造业竞争日益激烈的背景下,实现生产线的自动化与智能化已成为企业提升竞争力的关键。作为国内技术领先的工业物联网平台、数字孪生、自动控制技术厂商,中服云凭借其深厚的技术积累和创新能力,打造了一套完整的生产线自动化智能…...
【电动汽车充电系统核心技术全解:从can通讯高压架构到800V超充未来】
标题:电动汽车充电系统核心技术全解:从高压架构到800V超充未来 目录 前言:开篇暴击:中国电动车年产670万辆背后,充电技术如何破局一、充电系统架构解剖:四大核心模块如何“打配合”?二、CAN总线…...
uniapp-商城-62-后台 商品列表(分类展示商品的布局)
每一个商品都有类别,比如水果,蔬菜,肉,粮油等等,另外每一个商品都有自己的属性,这些都在前面的章节进行了大量篇幅的介绍。这里我们终于完成了商品类的添加,商品的添加,现在到了该进…...
在嵌入式系统中, 一般链路层断开多久,断开TCP为好
一、典型场景与推荐策略 1. 实时性优先(工业控制、自动化设备) 需求:快速释放资源,避免因等待重传浪费内存或阻塞任务。 策略: 立即断开:在lwip_netif_link_callback中检测到链路断开后直接关闭TCP连接&a…...
解决 MySQL 错误 1356 (HY000)
当你遇到 ERROR 1356 (HY000): View mysql.user references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 错误时,通常是由于 MariaDB 或 MySQL 版本更新导致的视图引用问题。 示例 UPDATE mysql.user SET H…...
【数据仓库面试题合集④】SQL 性能调优:面试高频场景 + 调优策略解析
随着业务数据规模的持续增长,SQL 查询的执行效率直接影响到数据平台的稳定性与数据产出效率。因此,在数据仓库类岗位的面试中,SQL 性能调优常被作为重点考察内容。 本篇将围绕常见 SQL 调优问题,结合实际经验,整理出高频面试题与答题参考,助你在面试中游刃有余。 🎯 高…...
机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征
机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 主…...
一个由微软开源的 Python 工具,用于将多种文件格式转换为 Markdown 格式
📚 Markitdown 由微软开源的 Python 工具,用于将多种文件格式转换为 Markdown 格式 支持:PDF、PowerPoint、Word、Excel、图像、音频、HTML、文本格式(CSV、JSON、XML)、ZIP 文件的转换。 它旨在提供一个简单且灵活的…...
Python多进程、多线程、协程典型示例解析
一、multiprocessing(多进程) 1. 模块简介 作用:创建多个独立运行的进程(每个进程有独立内存空间)适用场景:数学计算、图像处理等CPU密集型任务核心原理:绕过Python的GIL锁,真正利…...
httpx[http2] 和 httpx 的核心区别及使用场景如下
httpx[http2] 和 httpx 的核心区别在于 HTTP/2 协议支持,具体差异及使用场景如下: 1. 功能区别 命令/安装方式协议支持额外依赖适用场景pip install httpx仅 HTTP/1.1无通用请求,轻量依赖pip install httpx[http2]支持 HTTP/2需安装 h2>3…...
[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下
[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下 2.6 矩阵-向量形式2.7 求解状态值2.7.1 方法1:解析解2.7.2 方法2:数值解2.7.3 示例 2.8 动作值2.8.1 示例2.8.2 基于动作值的贝尔曼方程 本人为强化学习小白,为了在后续科研的过程…...
c/c++数据类型转换.
author: hjjdebug date: 2025年 05月 18日 星期日 20:28:52 CST descrip: c/c数据类型转换. 文章目录 1. 为什么需要类型转换?1.1 发生的时机:1.2 常见的发生转换的类型: 2. c语言的类型转换: (Type) value2.1 c语言的类型变换是如何实现的? 规则是什么? 3. c 的static_cast…...
大语言模型训练数据格式:Alpaca 和 ShareGPT
在大规模语言模型(LLM)的开发中,训练数据的质量和格式起着至关重要的作用。为了更好地理解和构建高质量的数据集,社区发展出了多种标准化的数据格式。其中,Alpaca 和 ShareGPT 是两种广泛使用的训练数据格式࿰…...
C++(23):容器类<vector>
目录 一、核心概念 二、基本语法 1. 头文件 2. 声明与初始化 三、常用操作 四、具体实例 1、size()、front()、back() 2、push_back()、pop_back()、capacity() 3、reserve() 一、核心概念 Vectors 包含着一系列连续存储的元素,其行为…...
Nginx配置中include mime.types的作用及正确配置mime类型
部署应用后发现页面没有正确加载CSS样式文件,通过检查nginx配置文件,发现nginx有一项配置include mime.type没有正确配置导致。 http {log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent &q…...
C++ 之 继承
1.继承的概念及定义 1.1继承的引入 我们设计一个person类,类中包含姓名、年龄、身高....等数据成员 我们再设计一个student类,类中也需要包含姓名、年龄、身高...等数据成员 我们再设计一个teacher类,类中也需要包含姓名、年龄、身高...等数…...
基于CNN的猫狗识别(自定义CNN模型)
目录 一,数据集介绍 1.1 数据集下载 1.2 数据集简介 二,模型训练 2.1 用到的模块 2.2 设置随机种子 2.3 图像的预处理 2.4 CNN模型层结构 2.5 初始化 2.6 训练和验证 三,模型测试 3.1 定义相同预处理 3.2 定义相同的层结构 3.3…...
互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨
互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨 场景描述 互联网大厂某次Java开发岗面试,主考官是一位严肃的技术专家,而应聘者则是搞笑的程序员“码农明哥”。面试围绕音视频场景的技术解决方案展开,探讨从Sprin…...
linux本地部署ollama+deepseek过程
1.Tags ollama/ollama GitHub 选择一个版本下载,我下的是0.5.12 2.tar解压该文件 3.尝试启动ollama ollama serve 4.查看ollama的版本 ollama -v 5.创建一个系统用户 ollama,不允许登录 shell,拥有一个主目录,并且用…...
【数据结构与算法】ArrayList 与顺序表的实现
目录 一、List 接口 1.1 List 接口的简单介绍 1.1 常用方法 二、顺序表 2.1 线性表的介绍 2.2 顺序表的介绍 2.3 顺序表的实现 2.3.1 前置条件:自定义异常 2.3.2 顺序表的初始化 2.3.2 顺序表的实现 三、ArrayList 实现类 3.1 ArrayList 的两种使用方式 3.2 Array…...
Vue 3.0 中的slot及使用场景
1. 基本概念 在 Vue 中, slot 用于定义组件中的插槽位置,外部的内容会被插入到组件内部的这个位置。插槽的内容是动态的,可以根据需要进行传递和渲染。它允许开发者在组件外部传递任意内容,并在组件内部进行渲染,主要…...
go语言协程调度器 GPM 模型
go语言协程调度器 GPM 模型 下面的文章将以几个问题展开,其中可能会有扩展处: 什么是调度器?为什么需要调度器? 多进程/多线程时cpu怎么工作? 进程/线程的数量多多少?太多行不行?为什么不行&…...
Python打卡 DAY 29
知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解:外部修改、动态 3. 类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工…...
C++控制结构详解:if-else、switch、循环(for/while/do-while)
1. 引言 在C编程中,控制结构用于控制程序的执行流程。它们决定了代码在什么条件下执行、如何重复执行某段代码,以及如何选择不同的执行路径。C提供了多种控制结构,主要包括: 条件语句:if-else、switch-case循环语句&…...
APP手机端测试覆盖点
通过上图,我们覆盖了完整的一个APP,需要进行哪些测试...
C++:⾯向对象的三⼤特性
面向对象的三大特性: 继承:允许一个类(子类 / 派生类)继承另一个类(父类 / 基类)的属性和方法,实现代码复用和层次化设计。 封装:将数据(成员变量)和操作数据…...
三、高级攻击工具与框架
高级工具与框架是红队渗透的核心利器,能够实现自动化攻击、权限维持和隐蔽渗透。本节聚焦Metasploit、Cobalt Strike及企业级漏洞利用链,结合实战演示如何高效利用工具突破防御并控制目标。 1. Metasploit框架深度解析 定位:渗透测试的“瑞…...
玄机-第二章日志分析-redis应急响应
前言 记录记录 关于redis的一些手法 redis未授权访问漏洞利用redis写webshell利用“公私钥” 认证获取root权限利用crontab反弹shellredis日志: /var/log/redis.log 1. 通过本地 PC SSH到服务器并且分析黑客攻击成功的 IP 为多少,将黑客 IP 作为 FLAG 提交; cd /var/log 查看…...
MoodDrop:打造一款温柔的心情打卡单页应用
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念:我想做一款温柔的情绪应用 「今天的你,心情如何?」 有时候&#x…...
Web开发-JavaEE应用SpringBoot栈SnakeYaml反序列化链JARWAR构建打包
知识点: 1、安全开发-JavaEE-WAR&JAR打包&反编译 2、安全开发-JavaEE-SnakeYaml反序列化&链 一、演示案例-WEB开发-JavaEE-项目-SnakeYaml序列化 常见的创建的序列化和反序列化协议 • (已讲)JAVA内置的writeObject()/readObje…...
RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试,踩坑介绍
视频讲解: RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试,踩坑介绍 今天测试下V2D,这是K1特有的硬件级别的2D图像加速器,参考如下文档,但文档中描述的部分有不少问题,后面会讲下 https://bianbu-linux.spa…...
学习!FastAPI
目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…...
【Python 算法零基础 4.排序 ① 选择排序】
就算经历各番碰撞,幸运也将一直站在我这边 —— 25.5.18 一、引言 选择排序(Selection Sort) 是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小…...
05 部署Nginx反向代理
01 服务器基本信息 名称IP地址真实Web服务器172.2.25.10Proxy服务器172.2.25.11 02 Proxy基本设置 [rootlikexy-nginx-01 conf.d]# pwd /etc/nginx/conf.d [rootlikexy-nginx-01 conf.d]# cat proxy.conf server {listen 80;server_name www.wp.proxy.com;location / {prox…...
通俗解释Transformer在处理序列问题高效的原因(个人理解)
Transformer出现的背景 CNN 的全局关联缺陷卷积神经网络(CNN)通过多层堆叠扩大感受野,但在自然语言处理中存在本质局限: 局部操作的语义割裂:每个卷积核仅处理固定窗口(如 3-5 词),…...
【Vue】路由1——路由的引入 以及 路由的传参
目录 一、什么是路由 ! 1.1 一个完整的前端路由规则编辑 1.2 后端路由 1.3 安装路由插件 1.4 嵌套(多级)路由 二、路由的query传参 2.1 传参 2.2 取值 三、命名路由 四、 路由的params参数 五、路由的props配置 第一种写法&…...
大模型为什么学新忘旧(大模型为什么会有灾难性遗忘)?
字数:2500字 一、前言:当学霸变成“金鱼” 假设你班上有个学霸,数学考满分,英语拿第一,物理称霸全校。某天,他突然宣布:“我要全面发展!从今天起学打篮球!” 一周后&am…...
07 负载均衡
01 面试题 面试题: 说一下如何实现的负载均衡 1.使用的proxy_pass模块 2.通过proxy_pass模块转发给upstream模块定义的地址池 3.使用的是默认的rr轮训算法分发到后端的服务器02 负载均衡配置 # 写一个简单的配置 [rootlikexy-nginx-01 conf.d]# cat lb.conf server {listen …...
谢赛宁团队提出 BLIP3-o:融合自回归与扩散模型的统一多模态架构,开创CLIP特征驱动的图像理解与生成新范式
BLIP3-o 是一个统一的多模态模型,它将自回归模型的推理和指令遵循优势与扩散模型的生成能力相结合。与之前扩散 VAE 特征或原始像素的研究不同,BLIP3-o 扩散了语义丰富的CLIP 图像特征,从而为图像理解和生成构建了强大而高效的架构。 此外还…...
【深度学习】残差网络(ResNet)
如果按照李沐老师书上来,学完 VGG 后还有 NiN 和 GoogLeNet 要学,但是这两个我之前听都没听过,而且我看到我导师有发过 ResNet 相关的论文,就想跳过它们直接看后面的内容。 现在看来这不算是不踏实,因为李沐老师说如果…...
最新最热门的特征提取方式:CVOCA光学高速复值卷积
目录 一、问题背景与核心挑战 二、CVOCA核心原理与数学建模 1. 复杂值卷积的数学表达 2. CVOCA的三大光学映射策略 三、关键创新点详解 1. 合成波长技术(Synthetic Wavelength) 2. 复杂值电光调制器(CVEOM) 3. 时间-波长交织卷积计算 四、代码实现与仿真验证 1. …...
获取Class的方式有哪些?
在Java中,获取Class对象是进行反射操作的基础,以下是几种常见方式及其详细说明,以及记忆方法: 1. 使用 .class 语法 语法:类名.class(如 String.class)。特点: 编译时确定ÿ…...
STM32八股【9】-----volatile关键字
一句话: 主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处: 1.在中断中修改访问的变量。 2.多任务(线程)共享的变量。 3.硬件寄存器变量 问题 嵌入式程序中常出现变量值改变但代码未正确响应的现象 原因 编译…...
【android bluetooth 协议分析 01】【HCI 层介绍 4】【LeSetEventMask命令介绍】
在蓝牙协议栈中,HCI_LE_Set_Event_Mask 是一个主机控制接口(HCI)层的命令,属于 LE(Low Energy)控制指令集。该命令用于 配置控制器向主机报告哪些 LE 事件,以便主机能够根据需求控制被中断的事件…...
关于文件分片的介绍和应用
文件分片,顾名思义,就是将一个大文件分割成多个小的文件块(chunk)。每个文件块都是原始文件的一部分,并可以通过特定的方式将这些小文件块重新组装成原始文件。 1. 基本原理: 文件分片从底层来看,主要是对…...