==記錄每天看的推文,記錄筆記,防止遺忘,持續更新,只寫出要點,不貼外鏈,詳細百度==
# 3、redis-分散式鎖
環境
單機或者叢集環境redis叢集、多個服務實現同步鎖
思考
- 1、setnx 如果key不存在,儲存value並返回1。如果key存在,不儲存value,返回0
加鎖: set test1 123 nx 解鎖: del
問題:如果獲取到鎖後當機,鎖將無法釋放
複製程式碼
- 2、加上過期時間
SET lockKey value NX EX 30
問題:A獲取到鎖後,處理時間過長超過過期時間,B獲取到鎖,A處理結束,釋放了B的鎖
複製程式碼
- 3、value 標識屬於當前執行緒的UUID,若非當前執行緒的value不刪除
問題:1、操作,判斷是否屬於當前執行緒,之後刪除並不是原子操作,寫lua指令碼,jedis.eval() 執行指令碼。
2、過期時間大於業務處理時間
複製程式碼
總結
1、setnx判斷,設定過期時間,判斷當前執行緒
叢集redis的分散式鎖
RedLock演算法
其他
Zookeeper 分散式鎖
# 2、一致性Hash
怎麼使用hash
- 叢集分散式儲存,直接讀取對應資料的伺服器
- 例如redis叢集,計算hash值儲存對應的伺服器,之後根據hash計算讀取,演算法:hash%(伺服器個數)
什麼是一致性執行性hash
- 伺服器移除或新增,普通hsah演算法不準確,記憶體雪崩
- 將伺服器計算hash值對映2^32環形hash值上,hash(str)%(2^32-1) 得到距離計算值最近的伺服器hash編號
- 可能會出現HASH環資料傾斜,可以計算伺服器多個hash值
# 1、高效能佇列Disruptor
高效能的原因
- 環形陣列資料結構
- 消除計算機層面上的偽共享
- 使用CAS無鎖同步
例項使用
- 建立生產者
- 建立消費者
- 注意點:防止訊息堆積,記憶體消耗
應用場景
- netty和Disruptor配合做定位
- 單執行緒最大600W訂單處理
- 延時佇列任務