一分钟实现分布式锁
一、緣起
分布式環(huán)境下,多臺機(jī)器上多個進(jìn)程對一個數(shù)據(jù)進(jìn)行操作,如果不做互斥,就有可能出現(xiàn)“余額扣成負(fù)數(shù)”,或者“商品超賣”的情況,如何實(shí)現(xiàn)簡易分布式鎖,對分布式環(huán)境下的臨界資源做互斥,是今天將要討論的話題。
二、互斥原理
原理:多個訪問方對同一個資源進(jìn)行操作,需要進(jìn)行互斥,通常是利用一個這些訪問方同時能夠訪問到的lock來實(shí)施互斥的。
例子1:同一個進(jìn)程內(nèi),多個線程的互斥,典型的場景是生產(chǎn)者消費(fèi)者對同一個queue進(jìn)行操作時的互斥
方案:設(shè)定一個所有線程能夠訪問到的lock實(shí)施互斥
步驟:
(1)多個線程同時搶鎖
(2)只一個線程搶到,未搶到的阻塞,或下次再來搶
(3)搶到鎖的線程操作臨界資源
(4)操作完臨界資源后釋放鎖
例子2:同一個操作系統(tǒng)上,多個進(jìn)程的互斥,典型的場景是手機(jī)上多個APP對同一個文件進(jìn)行寫入互斥
方案:設(shè)定一個所有進(jìn)程能夠訪問到的lock實(shí)施互斥(例如文件inode,OS幫我們做了)
步驟:
(1)多個進(jìn)程同時搶鎖
(2)只一個進(jìn)程搶到,未搶到的阻塞,或下次再來搶
(3)搶到鎖的進(jìn)程操作臨界資源
(4)操作完臨界資源后釋放鎖
三、分布式環(huán)境下多進(jìn)程互斥
分布式環(huán)境下,多臺機(jī)器上多個進(jìn)程對一個數(shù)據(jù)進(jìn)行操作的互斥,例如同一個uid=123要避免同時進(jìn)行扣款。
根據(jù)上面的原理,先找一個多臺機(jī)器多個進(jìn)程可以同時訪問到的一個lock,例如redis。
步驟:
(1)多臺機(jī)器上多個進(jìn)程對這個鎖進(jìn)行爭搶,例如在緩存上同時進(jìn)行set key=123操作
(2)只有一個進(jìn)程會搶到這個鎖,即只有一個進(jìn)程對緩存set key=123能夠成功,不成功的進(jìn)程下次再來搶
(3)搶到鎖的進(jìn)程對余額進(jìn)行扣減
(4)扣減完成之后釋放鎖,即對緩存delete key=123
分布式環(huán)境下的互斥,搞定。
author:?58沈劍
from:?http://zhuanlan.51cto.com/art/201612/524914.htm
總結(jié)
- 上一篇: Java程序员从笨鸟到菜鸟之(一百零九)
- 下一篇: SpringMVC运行报错 unable