理論系列 分布式鎖 簡單了解

2021-10-07 11:56:43 字數 1628 閱讀 1176

4. 關鍵

5. 不安全

6. redis demo

參考鎖,在多執行緒環境中控制對資源的併發訪問,比如synchronized、lock等

分布式鎖,synchronized和lock不只能本地加鎖,或者說單機部署環境下的鎖,在(單個服務)集群部署或者多服務完成乙個介面時,需要用到分布式鎖。

使用這麼乙個表:列作用

idresource_name

鎖定的資源名

node_info

機器資訊

count

重入次數

desc

create_time

update_time

上鎖:resource_name,排它鎖for update

解鎖:resource_name查詢到記錄,然後機器資訊驗證通過,count–,等於0則刪除

curator已經封裝好了分布式鎖的功能。

關鍵點:臨時(有序)節點、watch(無需處理超時,機器宕機則自動刪除節點)

setnx

setnx+ex

redisson已經封裝好了分布式鎖的功能。

關鍵點:原子命令略-

mysql

zkredis

場景:秒殺。提供乙個介面,成功則庫存-1,庫存數儲存在redis

使用者獲取當前庫存數,夠則扣除1,否則結束

問題:多個使用者訪問?見2. 本地鎖

("stock1"

)@responsebody

public string stock()

else

return

"end";}

多個使用者訪問,乙個乙個秒殺成功,直至沒有庫存數

問題:集群部署,使用者a訪問例項1,使用者b訪問例項1,如果剩餘1個庫存,可能ab都能秒殺成功

("stock2"

)@responsebody

public string stock()

else

}return

"end";}

前提:原子api,加鎖並設定過期時間

第一點:使用者獲取鎖,宕機。超時時間

第二點:業務時間 > 超時時間。定時器,定期更新

第三點:上鎖和解鎖為同乙個執行緒

// 原子,同時完成加鎖和過期時間設定

boolean setifabsent(k key, v value, long timeout, timeunit unit);

// 定時器,開個執行緒完成即可

// 上解鎖,新增乙個唯一標示,一般uuid即可

實現略。

("stock4"

)@responsebody

public string stock4()

catch (exception e)

int curstock = integer.

parseint

(redistemplate.

opsforvalue()

.get

(key));

if(curstock >0)

else

}finally

}return

"end";}

了解分布式鎖

主流的實現方式有三種 1 利用資料庫實現 2 利用快取 redis 實現 3 利用zookeeper實現 優點 簡單 易理解 缺點 高併發時,效能差,增加了資料庫開銷 方法一 方法二 優點 效率高 缺點 設定過期時間過長過短都不合適,需要根據實際情況權衡 大概思路 優點 有效的解決單點問題,不可重入...

簡單聊聊分布式鎖 Redis分布式鎖

單機redis分布式鎖 單機redis分布式鎖 首先咱們先聊聊單機的redis分布式鎖 第乙個最普通的實現方式,就是在 redis 裡使用 setnx 命令建立乙個 key,這樣就算加鎖。set resource name my random value nx px 30000執行這個命令就 ok。...

簡單聊聊分布式鎖 zookeeper分布式鎖

zookeeper分布式鎖 zookeeper分布式鎖 舉個栗子。對某乙個資料連續發出兩個修改操作,兩台機器同時收到了請求,但是只能一台機器先執行完另外乙個機器再執行。那麼此時就可以使用 zookeeper 分布式鎖,乙個機器接收到了請求之後先獲取 zookeeper 上的一把分布式鎖,就是可以去建...