什么是鎖
今天要談的是如何在分布式環(huán)境下實(shí)現(xiàn)一個全局鎖,在開始之前先說說非分布式下的鎖:
- 單機(jī) – 單進(jìn)程程序使用互斥鎖mutex,解決多個線程之間的同步問題
- 單機(jī) – 多進(jìn)程程序使用信號量sem,解決多個進(jìn)程之間的同步問題
這里同步的意思很簡單:某個運(yùn)行者,用某個工具,保障某段代碼,獨(dú)占的運(yùn)行,直到釋放。
分布式鎖解決的是 多臺機(jī)器 – 多個進(jìn)程 之間的同步問題,因?yàn)椴煌臋C(jī)器之間mutex/sem無法使用。不過要注意:即便如此,一個進(jìn)程內(nèi)多個線程之間仍舊建議使用mutex同步,盡量減少對分布式鎖服務(wù)造成不必要的負(fù)擔(dān)。
redis分布式鎖
首先呢,基于redis的分布式鎖并不是一個坊間方案,而是redis官網(wǎng)提供的解決思路并且有若干語言的實(shí)現(xiàn)版本直接使用。
今天要做的,首先是閱讀官方的文檔(中文點(diǎn)我,英文點(diǎn)我),有些地方講的不怎么清晰,所以我接下來會分析PHP版本的代碼,應(yīng)該可以解答你的主要疑惑。
分析代碼
首先打開代碼:https://github.com/ronnylt/redlock-php/blob/master/src/RedLock.php,這是PHP的官方推薦實(shí)現(xiàn)版本,它基于composer安裝(不懂composer可以點(diǎn)我)。