一分鐘實現分布式鎖

2021-07-30 22:21:33 字數 1739 閱讀 2775

一、緣起

分布式環境下,多台機器上多個程序對乙個資料進行操作,如果不做互斥,就有可能出現

「餘額扣成負數

」,或者

「商品超賣

」的情況,如何實現簡易分布式鎖,對分布式環境下的臨界資源做互斥,是今天將要討論的話題。

二、互斥原理

原理:多個訪問方對同乙個資源進行操作,需要進行互斥,通常是利用乙個

這些訪問方同時能夠訪問到的lock

來實施互斥的。例子1

:同乙個程序內,多個執行緒的互斥,典型的場景是生產者消費者對同乙個

queue

進行操作時的互斥

方案:設定乙個所有執行緒能夠訪問到的

lock

實施互斥

步驟:(

1)多個執行緒同時搶鎖(2

)只乙個執行緒搶到,未搶到的阻塞,或下次再來搶(3

)搶到鎖的執行緒操作臨界資源(4

)操作完臨界資源後釋放鎖例子2

:同乙個作業系統上,多個程序的互斥,典型的場景是手機上多個

對同乙個檔案進行寫入互斥

方案:設定乙個所有程序能夠訪問到的

lock

實施互斥(例如檔案

inode,os幫我們做了

步驟:(

1)多個程序同時搶鎖(2

)只乙個程序搶到,未搶到的阻塞,或下次再來搶(3

)搶到鎖的程序操作臨界資源(4

)操作完臨界資源後釋放鎖

三、分布式環境下多程序互斥

分布式環境下,多台機器上多個程序對乙個資料進行操作的互斥,例如同乙個

uid=123

要避免同時進行扣款。

根據上面的原理,

先找乙個多台機器多個程序可以同時訪問到的乙個

lock

,例如redis

步驟:(

1)多台機器上多個程序對這個鎖進行爭搶,例如在

快取上同時進行

set key=123操作(

2)只有乙個程序會搶到這個鎖,即

只有乙個程序對快取

set key=123

能夠成功

,不成功的程序下次再來搶(3

)搶到鎖的程序對餘額進行扣減(4

)扣減完成之後釋放鎖,即

對快取delete key=123

分布式環境下的互斥,搞定。 

技術領域,了解來龍去脈,了解本質原理,比用什麼工具實現更重要:

(1)程序多執行緒如何互斥?

檔案如何互斥?

(3)分布式環境下多個服務訪問乙個資源如何互斥?

歸根結底,是利用乙個互斥方能夠訪問的公共資源來實現分布式鎖,具體這個公共資源是redis來setnx,還是zookeeper,相反沒有這麼重要

。關於redis分布式鎖實現詳見:

redis分布式鎖

一分鐘實現分布式鎖

一 緣起 分布式環境下,多台機器上多個程序對乙個資料進行操作,如果不做互斥,就有可能出現 餘額扣成負數 或者 商品超賣 的情況,如何實現簡易分布式鎖,對分布式環境下的臨界資源做互斥,是今天將要討論的話題。二 互斥原理 原理 多個訪問方對同乙個資源進行操作,需要進行互斥,通常是利用乙個這些訪問方同時能...

一分鐘實現分布式鎖

一 緣起 分布式環境下,多台機器上多個程序對乙個資料進行操作,如果不做互斥,就有可能出現 餘額扣成負數 或者 商品超賣 的情況,如何實現簡易分布式鎖,對分布式環境下的臨界資源做互斥,是今天將要討論的話題。二 互斥原理 原理 多個訪問方對同乙個資源進行操作,需要進行互斥,通常是利用乙個這些訪問方同時能...

一分鐘sed入門(一分鐘系列)

1.簡介 sed是一種行編輯器,它一次處理一行內容。2.sed呼叫方式 sed options command file s sed options f scriptfile file s 第一種直接在命令列中執行,第二種把命令寫到了指令碼中,二者無本質區別。示例 1 列印hello.txt的內容 ...