日推筆記

litblank發表於2018-08-22

==記錄每天看的推文,記錄筆記,防止遺忘,持續更新,只寫出要點,不貼外鏈,詳細百度==

# 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訂單處理
  • 延時佇列任務

相關文章