欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis分布式鎖解決秒殺超賣問(wèn)題

 更新時(shí)間:2022年07月13日 08:30:23   作者:艷梓  
本文主要介紹了Redis分布式鎖解決秒殺超賣問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

分布式鎖應(yīng)用場(chǎng)景

秒殺環(huán)境下:訂單服務(wù)從庫(kù)存中心拿到庫(kù)存數(shù),如果庫(kù)存總數(shù)大于0,則進(jìn)行庫(kù)存扣減,并創(chuàng)建訂單
訂單服務(wù)負(fù)責(zé)創(chuàng)建訂單
庫(kù)存服務(wù)負(fù)責(zé)扣減庫(kù)存

模擬用戶訪問(wèn)庫(kù)存

多線程并發(fā)訪問(wèn),出現(xiàn)超賣問(wèn)題,線程不安全。沒(méi)有保證原子性

單體鎖的分類

單體應(yīng)用鎖指的是只能在 一個(gè)JVM 進(jìn)程內(nèi)有效的鎖。我們把這種鎖叫做單體應(yīng)用鎖

synchronized鎖ReentrantLock鎖
一個(gè) Tomcat 可以看作是一個(gè)JVM進(jìn)程,當(dāng)大量請(qǐng)求并發(fā)到系統(tǒng)時(shí),所有的請(qǐng)求都落在這唯一的一個(gè)Tomcat上,如果某些請(qǐng)求方法是需要加鎖的,比如:秒殺扣減庫(kù)存,是可以滿足需求的,但是隨著訪問(wèn)量的增加,導(dǎo)致一個(gè)tomcat 難以支撐,這時(shí)我們必然就是集群部署Tomcat ,使用多個(gè) Tomcat 共同支撐整個(gè)系統(tǒng)。

我們看到系統(tǒng)中存在兩個(gè)Tomcat,我們加的鎖是JDK提供的鎖,這種鎖只能在 一個(gè)JVM 下起到作用,也就是在一個(gè)Tomcat內(nèi)是沒(méi)有問(wèn)題的。當(dāng)存在兩個(gè)或兩個(gè)以上的Tomcat時(shí),大量的并發(fā)請(qǐng)求分散到不同的Tomcat上,在每一個(gè)Tomcat中都可以防止并發(fā)的產(chǎn)生,但是在多個(gè)Tomcat之間,每個(gè)Tomcat中獲得鎖的這個(gè)請(qǐng)求,又產(chǎn)生了并發(fā),從而產(chǎn)生超賣現(xiàn)象。這也就是單體應(yīng)用鎖的局限性了,它只能在一個(gè)JVM內(nèi)加鎖,所以單體鎖只能鎖住單體環(huán)境,是鎖不住分布式環(huán)境或集群環(huán)境的。

分布式鎖核心邏輯

分布式鎖的核心邏輯就是在多個(gè)服務(wù)中設(shè)置一個(gè)公共的資源,在公共資源中設(shè)置鎖,供多個(gè)服務(wù)去同時(shí)搶奪鎖資源,一旦其中一個(gè)線程搶奪成功,其他線程就進(jìn)入自旋狀態(tài),不同的嘗試訪問(wèn)獲取鎖資源,在獲取鎖資源的線程執(zhí)行完相應(yīng)的邏輯以后就會(huì)釋放鎖資源,其他線程就可以獲取鎖資源。

分布式鎖實(shí)現(xiàn)的問(wèn)題——死鎖和解決

死鎖:
如果某個(gè)線程在執(zhí)行鎖邏輯過(guò)程中宕機(jī),導(dǎo)致沒(méi)有刪除鎖
解決:

添加過(guò)期時(shí)間

因?yàn)槭欠窃有蕴砑舆^(guò)期時(shí)間,可能導(dǎo)致在添加過(guò)期時(shí)間之前就出現(xiàn)宕機(jī)現(xiàn)象,此時(shí)依舊進(jìn)入死鎖狀態(tài)。原子性添加過(guò)期時(shí)間

Redis解決刪除別人鎖的問(wèn)題

刪除別人鎖:
當(dāng)有線程A進(jìn)入后由于超時(shí),有其他線程B進(jìn)入,此時(shí)redis中的鎖是線程B的,而原來(lái)的線程A接著執(zhí)行,線程A刪除了別人的鎖。

刪除別人鎖解決:
①給當(dāng)前線程綁定一個(gè)局部變量uuid,由于每個(gè)線程都有一份自己的局部變量,那么線程和局部變量綁定之后,我們?cè)趧h除鎖之前判斷一下,當(dāng)前這把鎖是不是自己的載進(jìn)行刪除
②使用lua表達(dá)式進(jìn)一步解決

上述方案還是存在問(wèn)題,在線程A自己的uuid剛好與redis的uuid比較完,正準(zhǔn)備刪除的時(shí)候過(guò)期,這時(shí)候B線程進(jìn)入,此時(shí)的redisuuid就不是線程A的了,此時(shí)還是會(huì)存在刪除別人鎖的問(wèn)題。
這是由于在拿鎖、比較鎖和刪除鎖的過(guò)程中并不是原子性的操作。解決此問(wèn)題可以使用lua表達(dá)式

 到此這篇關(guān)于Redis分布式鎖解決秒殺超賣問(wèn)題的文章就介紹到這了,更多相關(guān)Redis秒殺超賣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis分布式鎖與zk分布式鎖的對(duì)比分析

    redis分布式鎖與zk分布式鎖的對(duì)比分析

    這篇文章主要介紹了redis分布式鎖與zk分布式鎖的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 5分鐘教你docker安裝啟動(dòng)redis全教程(全新方式)

    5分鐘教你docker安裝啟動(dòng)redis全教程(全新方式)

    今天,我來(lái)帶大家使用一種全新的方式docker來(lái)安裝redis,首先我們來(lái)了解一下什么是redis以及我們?yōu)槭裁匆褂胷edis,以及它的優(yōu)缺點(diǎn),感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • Redis全量同步和增量同步原理

    Redis全量同步和增量同步原理

    主從第一次同步是全量同步:也就是說(shuō),當(dāng)你主從節(jié)點(diǎn)連接建立后,需要執(zhí)行一次全量同步,但如果slave重啟后同步,此時(shí)slave重啟后,slave節(jié)點(diǎn)和master節(jié)點(diǎn)的數(shù)據(jù)之間有落后,因此需要進(jìn)行增量同步,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • Redis實(shí)現(xiàn)多人多聊天室功能

    Redis實(shí)現(xiàn)多人多聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)多人多聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Centos7.3安裝Redis4.0.6詳細(xì)圖文教程

    Centos7.3安裝Redis4.0.6詳細(xì)圖文教程

    這篇文章主要介紹了Centos7.3安裝Redis4.0.6詳細(xì)教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Redis的鍵String全面詳解

    Redis的鍵String全面詳解

    這篇文章主要為大家介紹了Redis的鍵String全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis字符串類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Redis底層類型之json命令使用

    Redis底層類型之json命令使用

    這篇文章主要為大家介紹了Redis底層類型之json命令使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • redis中opsForList().range()的使用方法詳解

    redis中opsForList().range()的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于redis中opsForList().range()的使用方法,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • redis分布式鎖解決緩存雙寫(xiě)一致性

    redis分布式鎖解決緩存雙寫(xiě)一致性

    這篇文章主要為大家介紹了redis分布式鎖解決緩存雙寫(xiě)一致性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論