亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2022年07月13日 08:30:23   作者:艷梓  
本文主要介紹了Redis分布式鎖解決秒殺超賣(mài)問(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)超賣(mài)問(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)生超賣(mài)現(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分布式鎖解決秒殺超賣(mài)問(wèn)題的文章就介紹到這了,更多相關(guān)Redis秒殺超賣(mài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 初始Redis概念、特性、安裝使用場(chǎng)景

    初始Redis概念、特性、安裝使用場(chǎng)景

    Redis是一款高性能的內(nèi)存鍵值對(duì)NoSQL數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)結(jié)構(gòu)及持久化機(jī)制,適用于緩存、消息隊(duì)列等場(chǎng)景,被廣泛應(yīng)用于各大企業(yè)及開(kāi)源系統(tǒng),是開(kāi)發(fā)運(yùn)維必備技能,本文給大家介紹初始Redis概念、特性、安裝使用場(chǎng)景,感興趣的朋友一起看看吧
    2025-07-07
  • redis熱key問(wèn)題怎樣解決

    redis熱key問(wèn)題怎樣解決

    這篇文章主要介紹了redis熱key問(wèn)題怎樣解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 如何使用gradle將java項(xiàng)目推送至maven中央倉(cāng)庫(kù)

    如何使用gradle將java項(xiàng)目推送至maven中央倉(cāng)庫(kù)

    本文主要介紹了使用gradle將java項(xiàng)目推送至maven中央倉(cāng)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis Key過(guò)期監(jiān)聽(tīng)的配置詳解

    Redis Key過(guò)期監(jiān)聽(tīng)的配置詳解

    這篇文章主要介紹了Redis Key過(guò)期監(jiān)聽(tīng)配置,默認(rèn)情況下在Windows系統(tǒng)中雙擊redis-server.exe用的是內(nèi)置的配置文件,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Redis連接池監(jiān)控(連接池是否已滿)與優(yōu)化方法

    Redis連接池監(jiān)控(連接池是否已滿)與優(yōu)化方法

    本文詳細(xì)講解了如何在Linux系統(tǒng)中監(jiān)控Redis連接池的使用情況,以及如何通過(guò)連接池參數(shù)配置、系統(tǒng)資源使用情況、Redis命令監(jiān)控、外部監(jiān)控工具等多種方法進(jìn)行檢測(cè)和優(yōu)化,以確保系統(tǒng)在高并發(fā)場(chǎng)景下的性能和穩(wěn)定性,討論了連接池的概念、工作原理、參數(shù)配置,以及優(yōu)化策略等內(nèi)容
    2024-09-09
  • SpringBoot集成Redis的思路詳解

    SpringBoot集成Redis的思路詳解

    Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。接下來(lái)通過(guò)本文給大家分享SpringBoot集成Redis的詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2021-10-10
  • Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題

    Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題

    在網(wǎng)站開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶重復(fù)刷新頁(yè)面的情況,本文就來(lái)介紹了Python利用redis限制用戶重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題,感興趣的可以了解一下
    2024-03-03
  • Redis出現(xiàn)(error)NOAUTH?Authentication?required.報(bào)錯(cuò)的解決辦法(秒懂!)

    Redis出現(xiàn)(error)NOAUTH?Authentication?required.報(bào)錯(cuò)的解決辦法(秒懂!)

    這篇文章主要給大家介紹了關(guān)于Redis出現(xiàn)(error)NOAUTH?Authentication?required.報(bào)錯(cuò)的解決辦法,對(duì)于 這個(gè)錯(cuò)誤這通常是因?yàn)镽edis服務(wù)器需要密碼進(jìn)行身份驗(yàn)證,但客戶端沒(méi)有提供正確的身份驗(yàn)證信息導(dǎo)致的,需要的朋友可以參考下
    2024-03-03
  • 使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制

    使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制

    JWT是一種輕量級(jí)的身份驗(yàn)證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點(diǎn)登錄(Single Sign-On, SSO)場(chǎng)景,本文給大家介紹了如何使用Redis來(lái)實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制,需要的朋友可以參考下
    2024-08-08
  • Redis Sentinel實(shí)現(xiàn)高可用配置的詳細(xì)步驟

    Redis Sentinel實(shí)現(xiàn)高可用配置的詳細(xì)步驟

    這篇文章主要介紹了Redis Sentinel實(shí)現(xiàn)高可用配置的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論