(Redis)Redis 分布式鎖及改進策略詳解

一、為什么需要分布式鎖

在單機應用中,synchronizedReentrantLock 足以解決并發問題。但在 分布式系統 中,多臺服務器之間共享同一個資源時,如果沒有鎖,很可能出現 超賣、重復扣減、數據不一致 等問題。
因此,分布式鎖應運而生,Redis 因其高性能與豐富指令,成為分布式鎖的常用實現工具。


二、Redis 實現分布式鎖的基本原理

Redis 分布式鎖主要基于 SET key value NX EX time 命令實現,核心思路:

  1. 加鎖

    • 使用 SETNX 保證 key 不存在時才能成功設置。

    • 使用 EX 設置過期時間,避免死鎖。

    • value 通常設置為隨機值,用于標識鎖的持有者。

  2. 解鎖

    • 判斷當前鎖的 value 是否是自己設置的隨機值。

    • 只有持有者才能釋放鎖。

    • 使用 Lua 腳本保證“查詢 value + 刪除 key”的原子性。

這樣可以保證:

  • 互斥性:同一時刻只有一個客戶端獲取鎖。

  • 避免死鎖:即使客戶端異常宕機,鎖也會自動過期釋放。

  • 可重入/安全解鎖:通過 value 標識持有者,防止誤刪別人的鎖。


三、可能存在的問題

  1. 鎖過期導致并發

    • 如果業務邏輯執行時間 > 鎖過期時間,可能導致鎖自動釋放,其他客戶端拿到鎖,出現數據不一致。

  2. 主從復制延遲問題

    • 在 Redis 主從架構下,如果主節點寫入成功但未同步到從節點,主節點宕機后從節點被提升為主,會導致鎖丟失。

  3. 不可重入性

    • 同一個線程多次加鎖會失敗,需要額外機制實現可重入。


四、改進策略

1. 合理設置過期時間

  • 根據業務邏輯耗時設置合理的鎖過期時間。

  • 可結合 鎖續期機制:在后臺定時任務中為鎖自動續期(如 Redisson 的 WatchDog)。

2. 使用 Lua 腳本保證原子性

  • 解鎖必須使用 Lua 腳本,保證“判斷 value + 刪除 key”操作的原子性。

3. Redlock 算法(Redis 官方提出)

  • 通過 多個 Redis 實例 獲取鎖,必須在大多數節點上成功才算加鎖成功。

  • 提高了分布式鎖的可靠性,避免因單點故障導致鎖失效。

4. 引入 Redisson 框架

  • Redisson 封裝了分布式鎖,支持可重入鎖、公平鎖、讀寫鎖、自動續期等功能。

  • 在實際業務中更推薦使用,而不是自己手寫。


五、典型應用場景

  1. 電商秒殺:防止超賣。

  2. 庫存扣減:保證同一商品庫存不會被多次扣減。

  3. 訂單防重:防止重復提交訂單。

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

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

相關文章

Linux應用開發-windows,linux環境下相關工具

VS Code Remote - SSH 虛擬機部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 設置開機自啟hostname -IVS Code部分的操作 安裝 Remote - SSH 插件 vscode右下角出現&#xff…

Java泛型通配符詳解:搞懂?/extends/super用法,避開集合操作踩坑點

上次跟你們聊了泛型的基礎用法,今天接著往下說 —— 泛型里還有個挺重要的概念叫 “通配符”,就是那個問號 “?”,很多人第一次見都懵:這玩意兒跟普通泛型有啥區別?為啥有時候非得用它不可?小索奇當初也卡…

EXCEL開發之路(二)跨表交互模擬—仙盟創夢IDE

在車輛租賃行業,數據的高效管理與分析對于企業的運營決策、資源調配及客戶服務優化至關重要。自建 Excel 實現多表統計交互,如同為行業裝上了效能驅動引擎,助力企業在復雜多變的市場環境中穩健前行。一、精準資源管理,優化車輛調配…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(八)

5.4 性能測試與結果分析 為了評估GoEHRStream的性能,我們設計測試模擬真實的醫院數據流場景,并測量關鍵指標。 5.4.1 實驗環境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

開關電源設計“反饋回路”部分器件分析

目錄 主要分析問題如下: 一、問題1 二、問題二 分析電路如下: 主要分析問題如下: 1、分析TL431芯片1、2兩引腳間并聯電阻和電容(RC電路)的作用? 2、PC817A光耦輸入兩個引腳間并聯電阻的作用?…

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢?

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢 在數字經濟快速發展的當下,AI 技術正不斷滲透到各個領域,其中 **#AI 編程憑借高效、便捷的優勢,成為不少開發者和創業者的新選擇。尤其是在小游戲…

Kafka 架構原理

一個kafka集群中包含一個或多個Producer、一個或多個broker、一個或多個ConsumerGrop以及一個Zookeeper集群。kafka通過Zookeeper管理kafka集群配置、leader副本的選舉、生產者的負載均衡等。Producer使用push模式將消息發布到broker,Consumer使用pull模式從broker訂閱并消費消…

用 PyTorch 搭建 CNN 實現 MNIST 手寫數字識別

在圖像識別領域,卷積神經網絡(CNN) 憑借其對空間特征的高效提取能力,成為手寫數字識別、人臉識別等任務的首選模型。而 MNIST(手寫數字數據集)作為入門級數據集,幾乎是每個深度學習學習者的 “第…

CTFshow系列——命令執行web61-68

本篇文章介紹了不同了方法進行題目的解析以及原因講解。 文章目錄Web61嘗試了一下,被過濾的payload如下:所以,根據上述思路,這里嘗試過的payload為:Web62(同Web61)Web63(同Web62&…

.Net程序員就業現狀以及學習路線圖(二)

一、.NET程序員就業現狀分析 1. 市場需求與崗位分布 2025年.NET開發崗位全國招聘職位約1676個,占全國技術崗位的0.009%,主要集中在一線城市如深圳、上海等地。就業單位類型分布為:軟件公司占43.3%,研發機構占33.1%,物聯…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代碼分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函數為界限進行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…

stm32f103c8t6 led閃燈實驗

目錄 閃燈原理 2種接線方式控制閃燈 使用推挽接法 使用開漏接法 看原理圖 寫代碼 閃燈原理 LED燈有個2-10mA的電流就可以點亮 3.3/5100.006A6mA 2種接線方式控制閃燈 使用推挽接法 當設置推挽模式時,CPU控制寄存器寫0,IO引腳輸出低電壓&#xff0…

“我同意”按鈕別亂點——你的“職業EULA”漏洞掃描報告

尊敬的審核: 本人文章《“我同意”按鈕別亂點——你的“職業EULA”漏洞掃描報告》 1. 純屬技術交流,無任何違法內容 2. 所有法律引用均來自公開條文 3. 請依據《網絡安全法》第12條“不得無故刪除合法內容”處理 附:本文結構已通過區塊鏈存證…

Product Hunt 每日熱榜 | 2025-09-01

1. A01 標語:你個人的新聞助手 介紹:A01 是你的新聞助手,可以幫你關注你關心的任何話題。只需告訴它你想了解什么,它就能為你帶來最新的文章。 產品網站: 立即訪問 Product Hunt: View on Product Hunt…

【OpenFeign】基礎使用

【OpenFeign】基礎使用1. Feign介紹1.1 使用示例1.2 Feign與RPC對比1.3 SpringCloud Alibaba快速整合OpenFeign1.3.1 詳細代碼1. Feign介紹 1.什么是 Feign Feign 是 Netflix 開發的一個 聲明式的 HTTP 客戶端,在 Spring Cloud 中被廣泛使用。它的目標是&#xff…

訪問相同的url,相同入參的請求,Apifox/Postman可以正常響應結果,而本地調用不行(或結果不同)

文章目錄問題概述Apifox查看實際請求總結問題概述 開發中有一個需求需要去別的系統中拿數據,配置好相關參數后發起請求時發現響應結果和在Apifox上不同,Apifox上正常顯示數據,而本地調用后返回數據不存在。 這就很奇怪了,想了很多…

數據結構(C語言篇):(七)雙向鏈表

目錄 前言 一、概念與結構 二、雙向鏈表的實現 2.1 頭文件的準備 2.2 函數的實現 2.2.1 LTPushBack( )函數(尾插) (1)LTBuyNode( ) (2)LTInit( ) (3)LTPrint( ) &#x…

從拿起簡歷(resume)重新找工作開始聊起

經濟蕭條或經濟衰退在經濟相關學術上似乎有著嚴格的定義,我不知道我們的經濟是否已經走向了衰退或者蕭條,但有一點那是肯定的,那就現在我們的經濟肯定是不景氣的。經濟不景氣會怎么樣?是的,會有很多人失業,…

OS+MySQL+(其他)八股小記

魯迅先生曾經說過,每天進步一點點,媽媽夸我小天才。 依舊今日八股,這是我在多個文檔整合一起的,可能格式有些問題,請諒解。 操作系統 1.進程和線程的區別? 進程是代碼在數據集合的一次執行活動,…

Transformer的并行計算與長序列處理瓶頸總結

🌟 第0層:極簡版(30秒理解)一句話核心:Transformer像圓桌會議——所有人都能同時交流(并行優勢),但人越多會議越混亂(長序列瓶頸)。核心問題 并行優勢&#x…