Redis機制-Redis互斥鎖、分布式鎖

目錄

一 互斥鎖

二 分布式鎖

Redis實現分布式鎖

redisson實現分布式鎖

可重入性:

主從一致性(性能差):


一 互斥鎖

假設我們現在有一個業務要實現秒殺優惠券的功能,如果是一個正常的流程,線程之間應該是這樣運作的。

線程1先查詢優惠券,如果庫存充足,那么扣減庫存,然后線程2來查詢優惠券信息,如果充足,那么就扣減庫存,但是這只是理想的情況。

那么如果出現圖2的這種情況呢?

線程1在查詢優惠券信息的時候發現庫存是充足的,線程2查詢的時候也是充足的,他倆都可以進行減庫存的操作,假如優惠券只剩1張了,那么誰得到這個優惠券呢?這就是業務中可能出現的問題。

此時就需要用互斥鎖來解決問題了

如圖,假如線程1在獲取互斥鎖以后,線程2來了之后就只能發起獲取鎖的請求,只有當線程1操作完了之后釋放鎖,線程2獲取到鎖,才可以進行接下來的操作,這樣就不會出現庫存超賣的情況。

但是還有一個問題,上面所說的這種情況是針對單個Redis服務器進行加鎖的,但是實際的業務邏輯中可能會有多個用戶,訪問多個Redis服務器,那么這時候要怎么解決呢?

二 分布式鎖

假設我的代碼部署到了多個tomcat中,每一個tomcat操控一個JVM,此時8080的虛擬機知道8081的線程1也在同時訪問優惠券信息嗎?這顯然是不知道的。

此時就需要用到一個獨立于tomcat之外的分布式鎖來進行判斷

如圖,當8080的線程1進行訪問時,其余的端口和線程都不可以進行訪問,此時就達到了分布式鎖的效果,有效的解決了超賣問題。要注意,分布式鎖是加在Redis上的,不是自己的代碼中。

Redis實現分布式鎖

Redis實現分布式鎖主要是利用Redis的setnx命令

SET LOCK VALUE NX EX 10  //加鎖
DEL key                  //釋放鎖

第一條代碼是加鎖并且給鎖設置過期時間,第二行代碼是刪除鎖。如果不給鎖設置過期時間,那么就有可能產生死鎖的現象。即線程1執行時間過長,線程2一直在等待鎖釋放。

redisson實現分布式鎖

redisson中也有分布式鎖的實現

RLock lock = redissonClient.getLock("lock");
try{boolean isLock = lock.tryLock(10,TimeUnit.SECONDS);if(isLock){System.out.println("執行業務");}
} finally{lock.unlock();}

首先,線程1獲取到鎖之后,然后去操作Redis,也會去通知看門狗系統,而看門狗系統會每隔釋放時間(redisson默認30秒)/3去給鎖續期,希望業務完成之前不要因為鎖到期而引發線程安全問題,此時線程1執行完,線程2獲取到鎖就可以繼續執行了。而加鎖和設置過期時間都是基于lua腳本完成的,這樣可以保證操作的原子性。

可重入性:

假設下圖是線程1所執行的代碼,在redis當中會按照哈希結構去進行存儲,key為鎖的key,value會存儲一個鍵值對,鍵為線程名稱,value為鎖的次數默認為0,加一次鎖就+1,釋放一次鎖就-1.

如上圖,執行add1( )時,Thread1第一次加鎖時,value會被改成1,當add2( )想獲取鎖時,此時Redis會進行判斷,你是不是線程1來的,發現add2( )的線程名為Thread1,那么此時該鎖可以重入的,value值會變成2,當add2( )執行完以后,釋放鎖,value又變為1,add1( )執行完以后,value變成0,此時的鎖才是真正被線程1所釋放了。

主從一致性(性能差):

如圖,如果是在集群模式下的Redis服務器勢必會有主節點和從節點,當線程1過來獲取到一把鎖時,主節點剛好宕機了,集群又重新選了一個主節點,線程2此時又獲取到了和線程1同樣的一把鎖,這樣就會產生鎖沖突的現象。

針對這樣的情況就要加紅鎖(RedLock):在多個Redis實例上加鎖,而不是只在一個節點上進行加鎖,這樣就可以避免鎖重復。

但是這樣實現相對來說比較復雜,因此AP思想和CP思想(zookeeper)可以解決該問題。

所以說性能和復雜是負相關的。

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

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

相關文章

數據結構中鏈表的題目

題目: 設計一個算法,要求將鏈表中所有節點的鏈接方向“原地”逆轉,即要求僅利用原表的存儲空間。 對于這個問題,首先要分析的是:鏈表中的頭和尾節點如何插入?其次就是:如何鏈接? 搞懂…

閱讀筆記——《未知協議狀態機推斷技術研究綜述》

【參考文獻】盛嘉杰, 牛勝杰, 陳陽, 等. 未知協議狀態機推斷技術研究綜述[J]. 計算機與現代化, 2023 (05): 58.【注】本文僅為作者個人學習筆記,如有冒犯,請聯系作者刪除。 摘要 協議逆向工程(PRE)描述了協議的行為邏輯&#xff…

spring cloud config server源碼學習(一)

文章目錄 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…

python3 + selenium webdriver自動化測試啟動不同瀏覽器

selenium webdriver自動化測試啟動不同瀏覽器 selenium webdriver 介紹Selenium WebDriver 進行自動化測試的一般流程瀏覽器驅動下載瀏覽器驅動的安裝chrome、edge、Firefox、Opera、Safari、phantomjs 應用Headless Chrome 、Headless Firefox 應用 selenium webdriver 介紹 …

shell命令運行原理及Linux權限問題

目錄 shell命令以及運行原理用戶管理添加用戶刪除用戶sudo Linux權限的概念Linux權限管理文件訪問者的分類(人)文件類型和訪問權限(事物屬性)文件權限值的表示方法文件訪問權限的相關設置方法 目錄的權限粘滯位 shell命令以及運行…

備考AMC8和AMC10競賽,吃透2000-2024年1850道真題和解析(持續)

多做真題,吃透真題和背后的知識點是備考AMC8、AMC10有效的方法之一,通過做真題,可以幫助孩子找到真實競賽的感覺,而且更加貼近比賽的內容,可以通過真題查漏補缺,更有針對性的補齊知識的短板。 今天我們繼續…

PostgreSQL基本使用Schema

參考文章:PostgreSQL基本使用(3)Schema_pg數據庫查詢schema-CSDN博客 PostgreSQL 模式(Schema)可以理解為是一個表的集合(或者所屬者)。 例如:在 MySQL 中,Scheam 是庫&…

gcc源碼分析(AST抽象語法樹)

文章目錄 三、AST相關1、AST(抽象語法樹)1.1 樹結點的聲明1.2 樹結點的結構1.2.1 tree_node聯合體1.2.2 tree_base結構體1.2.3 tree_common結構體1.2.4 常量結構體1.2.5 **標識符節點**2、符號綁定,作用域與block樹節點2.1 lang_identifier結構體2.2 c_binding結構體2.3 scop…

HLS視頻加密,讓您的視頻內容更安全!

背景介紹 HLS視頻加密是一種基于HTTP Live Streaming(HLS)協議的加密技術。它的核心思想是將視頻切片進行加密處理,在客戶端播放時需要先獲取解密密鑰才能正常偶發。通過這種方式,HLS加密可以有效防止未經授權的第三方竊取視頻內…

測試短信推薦參考

短信測試參考 國外: smstome 支持多個國家號碼 官網地址: https://smstome.com/ quackr.io 支持多個國家號碼 官網地址: https://quackr.io/ receive-smss 支持多個國家號碼 地址: https://receive-smss.com/ receive-sms-fr…

C#字典的常用方法

C#的字典(Dictionary)類是一個通用的集合類,它實現了鍵值對的存儲和訪問。以下是一些常用的字典方法: Add(key, value):向字典中添加一個指定的鍵值對。Remove(key):從字典中移除具有指定鍵的元素。Contai…

LLM大模型的7種推理框架分析

LLM的7種推理框架 Hugging Face的transformers 這是一個Python庫,可以簡化本地運行LLM的過程。 Transformers的優點: 自動模型下載提供代碼片段非常適合實驗和學習 Transformers的缺點: 需要對ML和NLP有深入了解需要編碼和配置技能 2.L…

深度學習之基于Tensorflow低光增強的深層Retinex分解

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理領域,低光照環境下的圖像增強是一個具有挑戰性的問題。為了提高圖像的可…

紐曼新品X1000:輕巧便攜僅重9.9公斤的1度電應急電源

在戶外救援行動和應急設備中,電力供應的穩定性和安全性直接影響到救援工作的效率和成功率。在現代救援工作中,常見的光學聲波探測儀、通信聯絡設備、氣象檢測儀、生命探測儀、照明設備等裝備均需有持續的電力供應,才能保障救援工作的有序開展…

西門子WINCC8.0VBS腳本學習講解

WinCC VBS腳本置位/復位/取反 二進制變量 "TAG1_BOOL1" 進行置位復位取反操作 步驟:按鈕-->對象屬性-->事件-->單擊鼠標VBS動作填入代碼如下: 對二進制變量進行復位 對二進制變量進行置位 對二進制變量進行取反 VBS腳本數學運算/讀寫批處理 …

第十六講:數據在內存中的存儲

第十六講:數據在內存中的存儲 1.整數在內存中的存儲1.1存儲方式1.2大小端字節序1.3大小端字節序排序規則1.4為什么要有大小端1.5練習1.5.1練習11.5.2練習21.5.3練習31.5.4練習41.5.5練習51.5.6練習61.5.7練習7 2.浮點數在內存中的存儲2.1練習2.2浮點數的存儲2.3浮點…

如何將數據從一部手機傳輸到另一部手機[安全快速]

概括 手機之間無需使用藍牙即可傳輸文件,配合專業的文件傳輸工具更高效。本文將向您介紹幾種使用不同的數據傳輸工具快速安全地將數據從一部手機傳輸到另一部手機的方法,特別是當有大文件或大量文件時。現在,我們來看看。 需要在朋友或家人之…

Rust 賦能前端 -- 寫一個 File 轉 Img 的功能

所有耀眼的成績,都需要苦熬,熬得過,出眾;熬不過,出局 大家好,我是柒八九。一個專注于前端開發技術/Rust及AI應用知識分享的Coder 此篇文章所涉及到的技術有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas腳手架生成項…

校園二手書交易|基于SprinBoot+vue的校園二手書交易管理系統(源碼+數據庫+文檔)

校園二手書交易管理系統 目錄 基于SprinBootvue的校園二手書交易管理系統 一、前言 二、系統設計 三、系統功能設計 1系統功能模塊 2管理員功能模塊 3 賣家用戶功能模塊 4 用戶功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八…

Linux:iptables防火墻部署優化之連接轉移(目的地地址轉化)

Linux:iptables防火墻部署優化之連接轉移(目的地地址轉化) 文章目錄 Linux:iptables防火墻部署優化之連接轉移(目的地地址轉化)node1操作檢測ip情況關閉firewalld防火墻服務,并鎖定該服務開啟ip…