Redis 非緩存核心場景及實例說明

Redis 非緩存核心場景及實例說明

一、分布式鎖

分布式鎖用于解決分布式系統中多節點競爭同一資源的問題,確保操作原子性。Redis 實現分布式鎖的核心思路是利用鍵的唯一性和原子命令,通常基于 Redisson 框架簡化實現(底層依賴 Redis 命令)。

實例:電商秒殺場景中防止庫存超賣。假設某商品庫存為 100 件,多臺應用服務器同時處理用戶搶購請求,需通過分布式鎖保證“查庫存-扣庫存”操作的原子性。

  1. 應用節點通過 Redisson 獲取鎖:RLock lock = redisson.getLock("seckill:lock:goodsId123"),底層會執行 SET seckill:lock:goodsId123 value NX PX 30000(NX 表示鍵不存在時才創建,PX 表示設置 30 秒過期時間,避免死鎖)。
  2. 獲取鎖成功后,查詢 Redis 中的商品庫存:GET goods:stock:123,若庫存 > 0,則執行扣庫存操作:DECR goods:stock:123
  3. 操作完成后釋放鎖:lock.unlock(),底層會刪除鎖鍵。若節點意外宕機,鎖鍵會因過期時間自動刪除,避免長期占用鎖資源。

二、限流

限流用于控制單位時間內接口的請求次數,防止系統因高并發過載。Redis 通常結合 Lua 腳本或 Redisson 實現,常見算法有令牌桶、漏桶等,Redisson 的 RRateLimiter 封裝了限流邏輯,底層依賴 Redis 數據結構和 Lua 腳本保證原子性。

實例:API 接口限流,限制單個用戶每分鐘最多發起 60 次請求(即每秒 1 次)。

  1. 使用 Redisson 創建限流器:RRateLimiter limiter = redisson.getRateLimiter("api:limiter:userId456"),設置限流規則:limiter.trySetRate(RateType.PER_USER, 60, 1, RateIntervalUnit.MINUTES)(表示每個用戶每分鐘最多 60 次請求)。
  2. 每次用戶發起請求前,調用 boolean allowed = limiter.tryAcquire(1)(嘗試獲取 1 個“令牌”)。若返回 true,則允許請求;若返回 false,則拒絕請求并返回“請求過于頻繁”。
  3. 底層通過 Redis 的 zset 存儲請求時間戳,結合 Lua 腳本計算單位時間內的請求次數,確保限流邏輯的原子性和準確性,避免多節點計數偏差。

三、消息隊列

Redis 可通過 List、Pub/Sub、Stream 三種方式實現消息隊列,其中 Stream 是 Redis 5.0 新增的專門用于消息隊列的數據結構,支持持久化、ACK 機制、消費組等特性,解決了 List 和 Pub/Sub 的消息丟失、堆積問題。

實例:訂單狀態變更通知,當訂單從“待支付”變為“已支付”時,需通知庫存系統扣減庫存、通知物流系統創建物流單。

  1. 生產者(訂單系統)向 Stream 發送消息:XADD order:status:stream * orderId 789 status PAID* 表示由 Redis 生成唯一消息 ID,包含時間戳和序列號;orderIdstatus 是消息內容)。
  2. 消費者組(庫存系統、物流系統)創建并訂閱 Stream:先創建消費組 XGROUP CREATE order:status:stream group:stock 00 表示從最早的消息開始消費),再通過 XREADGROUP GROUP group:stock consumer:stock 0 COUNT 1 BLOCK 0 STREAMS order:status:stream > 阻塞讀取消息(> 表示讀取未被消費的消息)。
  3. 消費者處理完消息后,發送 ACK 確認:XACK order:status:stream group:stock 消息ID,標記消息已處理,避免重復消費。若消費者宕機,未 ACK 的消息會留在“掛起隊列”,其他消費者可通過 XPENDING 查詢并重新處理,保證消息不丟失。

四、延時隊列

延時隊列用于處理“延遲執行”的任務,如訂單超時未支付自動取消、紅包 24 小時未領取自動退還。Redis 實現延時隊列的主流方式是 Redisson 的 RDelayedQueue,底層基于 zset 存儲任務(以“任務執行時間戳”為分數),結合定時任務掃描到期任務。

實例:訂單超時未支付自動取消,設置訂單創建后 30 分鐘未支付則取消。

  1. 創建 Redisson 客戶端并初始化延時隊列:RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("order:delay:queue"); RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(blockingQueue);
  2. 訂單創建時,將訂單 ID 放入延時隊列并設置延遲時間:delayedQueue.offer("orderId789", 30, TimeUnit.MINUTES)(表示 30 分鐘后該訂單 ID 會被放入阻塞隊列)。
  3. 消費者(訂單處理系統)啟動線程,通過 String orderId = blockingQueue.take() 阻塞獲取到期的訂單 ID,然后執行取消邏輯(如更新訂單狀態為“已取消”、恢復商品庫存)。
  4. 底層通過 zset 存儲訂單 ID 和到期時間戳,Redisson 后臺線程定期掃描 zset,將分數(到期時間戳)小于當前時間的任務移動到阻塞隊列,實現延時觸發。同時,Redis 持久化機制(RDB/AOF)確保任務在 Redis 宕機后不丟失,重啟后可繼續執行。

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

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

相關文章

【技術教程】如何將ONLYOFFICE文檔集成到使用Spring Boot框架編寫的Java Web應用程序中

在現代協作辦公環境中&#xff0c;將功能強大的文檔編輯器無縫集成到自有業務系統中&#xff0c;已成為提升工作效率和用戶體驗的關鍵需求。ONLYOFFICE 文檔服務器提供了一套成熟的在線文檔編輯解決方案&#xff0c;而 Java Spring Boot 則是構建高效、模塊化 Web 應用的熱門框…

openharmony之AV_CodeC音視頻編解碼模塊詳解(二)

1. 音頻解碼器函數調用流程 1.1 音頻解碼器架構概覽 decoder:解碼器 encoder:編碼器 前面文章介紹了關于openHarmony的AV_CodeC模塊,這篇文章將詳細講解編解碼時函數的調用流程 音頻解碼器采用插件化架構,核心實現位于: services/engine/codec/audio/decoder/audio_ffmpeg…

PDF24 Creator:免費的多功能PDF工具

在處理PDF文件時&#xff0c;一個功能強大且免費的PDF工具是許多用戶的首選。PDF24 Creator作為一款免費的PDF工具&#xff0c;提供了豐富的功能&#xff0c;幫助用戶創建、編輯和轉換PDF文件&#xff0c;滿足從初學者到專業用戶的各種需求。它不僅支持PDF與Word、Excel等15種以…

VBA 中使用 ADODB 操作 SQLite 插入中文亂碼問題

問題 使用 VBA 的 ADODB 對象的 command 對象、parameter 對象&#xff0c;插入的中文數據為亂碼 驅動下載、安裝、引用 驅動網址(下載路徑) 使用的 ODBC 驅動&#xff08;需要梯子才能下載&#xff0c;感謝大佬開源&#xff09; http://www.ch-werner.de/sqliteodbc/ 版本…

執行select * from a where rownum<1;,數據庫子進程崩潰,業務中斷。

文章目錄環境癥狀觸發條件解決方案環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.2 癥狀 執行select * from a where rownum<1;&#xff0c;數據庫子進程崩潰&#xff0c;業務中斷。 觸發條件 select 和 where條件帶有rownum…

python庫 Py2app 的詳細使用(將 Python 腳本變為 MacOS 獨立軟件包)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、Py2app 概述 1.1 Py2app 介紹 1.2 安裝 1.3 替代工具推薦 二、基礎使用 2.1 最簡單的 setup.py 文件 2.2 完整示例 2.3 配置選項詳解 2.4 完整項目案例 2.5 打包為單文件應用(可選) 三、高級配置 3.1 處理特定…

NTP配置為客戶端廣播監聽模式

前言 項目需求&#xff1a; 使能ntp為客戶端模式&#xff0c;能監服務端廣播模式發出的ntp報文&#xff0c;計算出服務端的時間與客戶端的時間偏差并上報。 開發狀況&#xff1a; 交叉編譯ntp源碼&#xff0c;將修改后的ntpd進程部署到設備上作為客戶端完成項目需求 如何操作&a…

Claude-Flow 使用指南

Claude-Flow 不僅僅是一個工具&#xff0c;更是一個強大的AI驅動開發編排平臺。本問初步帶您深入了解 Claude-Flow v2.0.0 Alpha 的強大功能&#xff0c;助您在AI開發領域如虎添翼。1. 簡介&#xff1a;什么是 Claude-Flow&#xff1f; Claude-Flow v2 Alpha 是一個企業級的AI編…

系統梳理 Test-Time Compute 的主要實現路徑

編者按&#xff1a; AI 真的在“思考”嗎&#xff1f;當模型面對數學推理、代碼生成或復雜決策時&#xff0c;它是如何一步步推演出答案的&#xff1f;如果你曾困惑于大模型在關鍵任務中表現不穩定、缺乏可解釋性&#xff0c;甚至生成結果難以驗證&#xff0c;那么你并不孤單。…

vue 經常寫的echarts圖表模塊結構抽取

vue 經常寫的echarts圖表模塊結構抽取將項目中經常寫的結構抽取一下, 方便以后用 表頭包含標題和右側操作部分下面為圖表 <div class"chartBox"><div class"chartheadbox"><div class"chartheadleft">這是圖表標題</div>…

主流的開源協議(MIT,Apache,GPL v2/v3)

文章目錄1. MIT 協議 (MIT License)2. Apache 2.0 協議 (Apache License 2.0)3. GPL v2 協議 (GNU General Public License v2)“開源協議選擇指南”的流程圖 flowchart TDA[開始選擇開源協議] --> B{是否要求修改后必須開源?<br>(是否具有 傳染性?)};B -- 是&…

CameraService筆記

cameraservicecamera 結構圖1. 啟動CameraServer1.1 注冊media.camera服務1.2 構造CameraService1.3 CameraService::onFirstRef1.4 CameraService::enumerateProviders&#xff1a;前置準備知識1.4 CameraService::enumerateProviders&#xff1a;Provider和Device初始化1.4.1…

MacOS 15.6 編譯SDL3 Android平臺多架構so庫

成功編譯輸出: 編譯: Android平臺多架構編譯腳本: sdl3_android_build.sh #!/bin/bash# 設置變量 macos 其他系統需要更改路徑 SDL_SOURCE_DIR=$(pwd)/SDL BUILD_DIR=${SDL_SOURCE_DIR}/../sdl3_build_android NDK_PATH=$HOME/Library/Android/Sdk/Ndk/25.2.9519653 CMAKE…

Real-IAD D3: A Real-World 2D/Pseudo-3D/3D Dataset for Industrial Anomaly

Real-IAD D: A Real-World 2D/Pseudo-3D/3D Dataset for Industrial Anomaly Detection Paper Github 摘要 隨著工業異常檢測&#xff08;Industrial Anomaly Detection, IAD&#xff09;復雜程度的不斷提升&#xff0c;多模態檢測方法已成為機器視覺領域的研究焦點。然而&a…

IT需求提示未讀信息查詢:深度技術解析與性能優化指南【類似:釘釘已讀 功能】

IT需求提示未讀信息查詢&#xff1a;深度技術解析與性能優化指南【類似&#xff1a;釘釘已讀 功能】 DROP TABLE IF EXISTS rs_kpi_it_need_tip; CREATE TABLE IF NOT EXISTS rs_kpi_it_need_tip (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵ID&#xff…

Django中的軟刪除

軟刪除&#xff08;Soft Delete&#xff09;是一種數據刪除策略&#xff0c;它并不真正從數據庫中刪除記錄&#xff0c;而是通過標記&#xff08;如 is_deleted 字段&#xff09;來表示記錄已被刪除。 這樣做的好處是可以保留數據歷史&#xff0c;支持數據恢復和審計。 在 Djan…

JavaEE 進階第四期:開啟前端入門之旅(四)

專欄&#xff1a;JavaEE 進階躍遷營 個人主頁&#xff1a;手握風云 目錄 一、常用CSS 1.1. border 1.2. width/height 1.3. padding&#xff1a;內邊距 1.4. margin&#xff1a;外邊距 二、初始JavaScript 2.1. JavaScript是什么 2.2. 發展歷史 2.3. JavaScript 和 HT…

學習日記-SpringMVC-day49-9.4

知識點&#xff1a;1.RequestMapping&#xff08;3&#xff09;知識點核心內容重點RequestMapping注解的parameters屬性通過parameters指定請求參數條件&#xff08;如bookID&#xff09;&#xff0c;控制請求匹配規則&#xff08;必須包含/排除特定參數或值&#xff09;參數存…

【Day 50 】Linux-nginx反向代理與負載均衡

概述在現代 Web 架構中&#xff0c;Nginx 作為高并發、高性能的 HTTP 和反向代理服務器&#xff0c;被廣泛應用于提升服務性能、增強系統安全性和實現負載均衡。其中&#xff0c;反向代理能夠隱藏后端服務器信息并優化請求處理流程&#xff0c;負載均衡則可將請求分發到多個后端…

vue中配置 ts

在 Vue 項目中配置 TypeScript&#xff08;TS&#xff09;可以提升代碼的類型安全性和開發體驗。以下是在 Vue 項目&#xff08;基于 Vite&#xff09;中配置 TypeScript 的詳細步驟和關鍵配置&#xff1a; 一、創建支持 TypeScript 的 Vue 項目 如果是新建項目&#xff0c;推…