Redis學習筆記——黑馬點評 消息隊列25-30

前言:

學習收獲:

Redis消息隊列:

消息隊列(Message Queue),字面意思就是存放消息的隊列。最簡單的消息隊列包括3個角色:

  • 消息隊列:存儲和管理消息,也被稱為消息代理
  • 生產者:發送消息到消息隊列
  • 消費者:從消息隊列獲取消息并處理消息

通過消息隊列解除耦合,提高工作效率。使秒殺搶單的業務和寫入數據庫業務分離,解除里耦合。提高了并發能力。

消息隊列是一個獨立與JVM的服務,不受JVM的內存影響,解決了內存限制問題。并且消息隊列不僅僅是做一個數據存儲的問題,還有一個數據安全的問題,存進消息隊列的所有消息會做持久化操作,并且還會確保每個消息至少執行一次。

Redis通過了三種不同的方式來實現消息隊列:

  • list結構:基于List結構模擬消息隊列
  • PubSub:基本的點對點消息模型
  • Stream:比較完善的消息隊列模型

List模擬消息隊列:

Redis的list數據結構是一個雙向鏈表,很容易模擬出隊列效果。隊列時入口和出口不在一邊,因此我們可以利用:LPUSH結合RPOP、或者RPUSH結合LPOP來實現。不過要注意的是,當隊列中沒有消息時RPOPLPOP操作會返回null,并不像JVM的阻塞隊列那樣會阻塞并等待消息。不過可以通過使用BRPOP或者BLPOP來實現阻塞效果。

與阻塞隊列相比,它是在JVM以外的獨立的存儲,不用依賴內存,不用擔心存儲上限的問題。并且Redis支持數據持久化,如果宕機了,數據也還存在。?

基于List消息隊列的優缺點:

優點:

  • 利用Redis存儲,不受限于JVM內存上限
  • 基于Redis的持久化機制,數據安全性有保證
  • 可以滿足消息有序性

缺點:

  • 無法避免消息丟失
  • 只支持單消費者:無法實現一條消息被很多消費者消費的需求

基于PubSub(發布訂閱)的消息隊列:

PubSub(發布訂閱)是Redis2.0版本引入的消息傳遞模型。顧名思義,消費者可以訂閱一個或多個channel,生產者向對于channel發送消息后,所有訂閱者都能收到相關消息。

  • SUBSCRIBE channel [channel]:訂閱一個或多個頻道
  • PUBLISH channel msg:向一個頻道發送消息
  • PSUBSCRIBE pattern [pattern]:訂閱于pattern格式匹配的所有頻道

并且基于PubSub的消息隊列天生就是堵塞的。?

基于PubSub消息隊列的優缺點:

優點:

  • 采用發布訂閱模型,支持多生產、多消費

缺點:

  • 不支持數據持久化
  • 無法避免消息丟失
  • 消息堆積有上限,超出時數據丟失?

?List有數據持久化,是應為他本來就是做數據存儲的,只是我們把他當作消息隊列來用了。而Redis用來做數據存儲的都支持數據持久化。而PubSub他本來就是做消息發送的,因此當我們發送一條消息是,如果這個頻道沒有被任務消費者訂閱時,那么這條消息就可能丟失。

基于Stream的消息隊列:

Stream是Redis5.0引入的一種新的數據類型,可以實現一個功能非常完善的消息隊列。他是一種以數據流為核心設計理念的消息中間件,它將消息視為連續的數據流進行處理,具備高吞吐量、低延遲、持久化存儲和實時流處理等特性。

  • 發送消息的命令:

  • 讀消息的方式之一:

在業務開發中,我們可以循環的調用XREAD阻塞方式來查詢最新消息,從而實現持續監聽隊列的效果,偽代碼如下:

?基于Stream類型消息隊列的XREAD命令特點:

  • 消息可回溯
  • 一個消息可以被多個消費者讀取
  • 可以阻塞讀取
  • 有消息漏讀的風險?

上面我們介紹的消費方式都是單消費方式,容易發生消息堆積導致消息丟失,所以我們需要改用消費者組的模式。

消費者組:將多個消費者劃分到一個組中,監聽同一個隊列。

  • 消息分流:隊列中的消息會分流給組內的不同消費者,而不是重復消費,從而加快消息處理速度
  • 消息標示:消費者會維護一個標示,記錄最后一個被處理的消息,哪怕消費者宕機重啟,還會從標示之后讀取消息。確保每一個消息都會被消費
  • 消息確認:消費者獲取消息后,消息處于pending狀態,并存入一個pending-list。當處理完成后需要通過XACK來確認消息,標記消息為已處理,才會從pending-list移除。

這里的消息確認會確保所有消息至少會被消費一次,就不會有出現獲取到消息,但是沒有消費的情況。

常見命令:

# 創建消費者組
XGROUP CREATE key groupName ID
# 刪除指定的消費者組
XGROUP DESTORY key groupName
# 給指定的消費者組添加消費者
XGROUP CREATECONSUMER key groupName consumerName
# 刪除消費者組中指定消費者
XGROUP DELCONSUMER key groupName consumerName
# 從消費者組中讀取消息
XREADGROUP GROUP

?

stream類型消息隊列的XREADGROUP命令特點:

  • 消息可回溯

  • 可以多消費者爭搶消息,加快消費速度

  • 可以阻塞讀取

  • 沒有消息漏讀的風險

  • 有消息確認機制,保證消息至少被消費一次

消除了漏讀的風險,會標記上一次消費 消費到哪里了,然后從此處繼續消費。

總結:

Stream的消息確認僅支持消費者的確認機制,不支持生產者的確認機制(如果生產者再發消息使,消息丟失)。?

基于Redis的Stream實現異步秒殺下單:

1. 創建一個Stream的消息隊列,名為stream.orders

2.?之前是在java代碼中取調用lua腳本,僅僅判斷有沒有資格,然后取利用java代碼去王阻塞隊列里添加。但現在使發消息,就是redis的命令,直接lua腳本里發送,減少了java代碼,和與redis的交互。

?

?在VoucherOrderServiceImpl中編寫Java代碼:

/*** 搶購秒殺券** @param voucherId* @return*/@Transactional@Overridepublic Result seckillVoucher(Long voucherId) {Long userId = ThreadLocalUtls.getUser().getId();long orderId = redisIdWorker.nextId(SECKILL_VOUCHER_ORDER);// 1、執行Lua腳本,判斷用戶是否具有秒殺資格Long result = null;try {result = stringRedisTemplate.execute(SECKILL_SCRIPT,Collections.emptyList(),voucherId.toString(),userId.toString(),String.valueOf(orderId));} catch (Exception e) {log.error("Lua腳本執行失敗");throw new RuntimeException(e);}if (result != null && !result.equals(0L)) {// result為1表示庫存不足,result為2表示用戶已下單int r = result.intValue();return Result.fail(r == 2 ? "不能重復下單" : "庫存不足");}// 2、result為0,下單成功,直接返回ok// 索取鎖成功,創建代理對象,使用代理對象調用第三方事務方法, 防止事務失效IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();this.proxy = proxy;return Result.ok();}
————————————————該文章版權屬于知識汲取者,未經允許請勿轉載原文鏈接:https://blog.csdn.net/qq_66345100/article/details/131986713

3.

  • 獲取消息隊列中的訂單信息
  • 判斷消息獲取是否成功
  • 如果獲取失敗,說明沒有消息,繼續下一次循環
  • 如果獲取成功,則可以下單
  • ACK確認

?qps1000平均值889異常率0%吞吐量474.2,可以看到stream實現的消息隊列并沒有比Java的BlockingQueue實現的消息隊列高多少性能,但是stream實現的信息隊列比BlockingQueue實現的消息隊列的可靠性靈活性要高一大截。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Django+Vue3的草莓病害檢測系統設計與實現,Web前后端分離,YOLOv8 Web目標檢測系統

這里寫自定義目錄標題 基于DjangoVue3的草莓病害檢測系統 基于DjangoVue3的草莓病害檢測系統 本項目結合 YOLOv8 與 Django Vue3 ,構建了一個通用的 Web 前后端系統,便于用戶進行目標檢測的操作和展示,實現對圖片、視頻實時目標檢測和攝像頭…

【MFC】樹控件的使用詳解

目錄 添加線條鏈接 添加折疊小按鈕 設置樹控件的節點和對應的圖標 設置默認選中項 設置選中項切換響應函數 涉及接口介紹: 首先我們通過資源視圖可以添加一個樹形控件,如下: 添加線條鏈接 在樹形控件中,有一個屬性“Has…

跨境賣家警報。抽繩背包版權案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.對其熱銷的抽繩設計多功能運動背包發起跨境版權維權,保護范圍涵蓋產品外觀設計。 案件基本情況: 起訴時間:2025-6-12 案件號:25-cv-06509 原…

Android Activity全面解析:從創建到生命周期的完整指南

Activity作為Android四大組件之一,是構建用戶界面的核心單元。筆者通過郭霖著的第一行代碼入門安卓,內容基本都取自書中,這篇博客作為筆者的筆記同時精簡了一些書中內容分享在csdn中 一、Activity的創建與基礎配置 1.1 創建Activity的基本步…

深入理解 Python 的 secrets 模塊:打造更安全的隨機數生成機制

深入理解 Python 的 secrets 模塊:打造更安全的隨機數生成機制 在構建涉及用戶身份認證、權限管理、加密通信等系統時,開發者最不能忽視的一個問題就是“安全性”。安全問題的核心之一在于“隨機性”——尤其是密碼、驗證碼、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、關鍵術語解析 1.1 并發 (Concurrency) 定義: 并發是指同時處理多個待處理任務的能力,這些任務可以依次或并行(如果可能)進行,最終每個任務都會成功或失敗。 理解: 單核 CPU: 即使是單核 CPU 也可以實…

DCM4CHEE Archive Light 開發環境部署(5)-IDEA集成調試配置

系列文章目錄 DCM4CHEE Archive light 開發環境部署(1)-前言DCM4CHEE Archive light 開發環境部署(2)-PostgreSQLDCM4CHEE Archive light 開發環境部署(3)-OpenLDAPDCM4CHEE Archive light 開發環境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 開發環境部署(5)-IDEA集成…

在rust中執行命令行輸出中文亂碼解決辦法

如果你使用標準的依賴庫執行命令中包含中文的話, 就會發現中文亂碼,如果你的輸出中沒有中文,就可以正常輸出,因為windows的命令行默認使用的是gbk編碼。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判斷當前瀏覽器卡不卡

方法一:使用 requestAnimationFrame 和時間戳計算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡頓的標志function calculateFPS(currentTime) {frameCount;// 每隔大約 1000 毫秒(1秒&#…

51c嵌入式~電路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延長電子元器件的貨架壽命 本文探討了電子元器件的貨架壽命問題,重點討論了氧化、濕度敏感等級(MSL)與貨架壽命之間的關系。文章通過具體例子說明了氧化對電子元器件可…

Eureka 與 Feign(一)

Eureka 與 Feign 知識解析 1. Eureka Spring Cloud Eureka 是服務發現組件,包含: Eureka Server:注冊中心,管理服務實例Eureka Client:服務實例,向注冊中心注冊/獲取服務信息 核心功能: 服…

AN動畫軟件|Animate 2025百度云下載與安裝教程指南

如大家所了解的,?Animate全稱Adobe Animate,常常也被簡稱為AN。它是一款2D動畫制作軟件?,其前身為Flash Professional CC,2016年更名為Animate CC,支持Flash SWF文件及HTML5動畫創作,廣泛應用于網頁交互、…

提示詞工程中常見協議框架應用實例

一、生成式診斷催化協議(Generative Diagnosis Catalysis, GDC) 技術原理:基于神經符號系統的因果推理引擎,融合貝葉斯網絡與強化學習 實施場景: class DiagnosticCatalyst:def __init__(self, domain="醫療診斷"):self.causal_graph

資深Java工程師的面試題目(七)JDK JVM

以下是針對 Java 面試者 的 JVM 和 JDK 相關題目,涵蓋核心知識點、實際應用場景和進階問題: 一、JVM 基礎 1. JVM 內存模型 題目: 請描述 JVM 的內存模型及其組成部分,并說明每個區域的作用。 解析: JVM 內存模型分…

【系統設計【4】】設計一個限流器:從理論到實踐的完整解決方案

文章目錄 第一步:理解問題并確定設計范圍1、為什么需要限流器2、需求澄清的藝術3、需求總結與優先級 第二步:提出高層次設計并獲得認同1. 限流器的部署位置選擇2. 限流算法的選擇與權衡3. 高層架構設計 第三步:深入設計1、限流規則的設計與管…

基于DETR目標檢測項目

DETR見解 DETR(Detection Transformer)是一種端到端的目標檢測模型,由Facebook AI Research(FAIR)于2020年提出。DETR采用了Transformer架構,與傳統的基于區域的目標檢測方法有所不同,它通過全…

ZooKeeper 集群部署

ZooKeeper 集群部署 前言安裝部署資源下載JDK 部署Zookeeper 部署 前言 在 Linux 服務器上部署 Zookeeper 之前,需要先安裝 JDK。以下是相關版本及環境信息: JDK 版本 jdk-17_linux-x64_bin.tar.gz Zookeeper 部署的版本 3.5.7 操作系統版本 Red Hat E…

8.TCP Server端實現

1.C/S模型 2.Server 端功能分析 tcp_server.c #include "tcp_server.h" #include "lwip/sockets.h" #include <stdio.h>char ReadBuff[BUFF_SIZE]; /* TCP服務器任務函數 */ void vTcpserver_Task(void) {int sfd, cfd, n, i;struct sockaddr_in…

課設作業圖書管理系統

用戶注冊&#xff0c;登錄 播放地址 課設作業圖書管理系統_嗶哩嗶哩_bilibili 對圖書進行增刪改查 package com.xwr.controller; import com.xwr.entity.Book; import com.xwr.entity.Category; import com.xwr.service.BookService; import com.xwr.service.CategoryServ…

springboot 配置加密

springboot 配置加密 [TOC](springboot 配置加密) 前言一、在配置類賦值之前解密二、修改賦值后加密的配置類 前言 在一些國家項目中經常會要求不能暴露數據庫鏈接和密碼, 所以需要對配置文件里面的一些配置進行加密處理。 解決方法有兩種&#xff1a;一種是在配置加載后還沒給…