分佈式鎖

  • 鎖的概念:

    • 線程的通信方式有兩種,同步和可見性
    • 同步的本質是通過鎖來實現,可見性只在特定情況下才能保證線程安全,比如volitile,對jvm優化過後的指令進行重排序,強制要求線程刷新主存,但是 如果當前值由該變量以前的值相關 比如執行非原子操作的++,那這時候就不安全了
    • 比如java中大量用到的synchronized 鎖,同時滿足同步和可見性
      這是在單機系統中,但是在分佈式系統中,多個相同服務就不能達到同步了

  • 分佈式鎖的實現

    • 其實這個東西說起來也很簡單,就是微服務的時代下應運而生的東西,實現方式主要爲藉助中間件 比如redis, memcached ,zookeeper等,有了這些中間件,分佈式服務都會通過中間件去拿取和銷燬鎖,這樣來完成同步
  • memcached的實現:

    • client客戶端用的是memcached-java-client
    • 會去memcached中插入一個k v ,k如果存在返回失敗,否則返回true,比如應用於回絕重複請求,請求id可以作爲key,設置time的過期時間是爲了避免客戶端宕機後造成死鎖,另外memcached宕機的話,數據是不會恢復的,沒有持久化功能,需要注意,集羣一定程度上可以避免這個問題
memCachedClient.add(key, value, time);
  • Redis的實現

    • 藉助到setnx關鍵字同樣也是,存入kv,設置成功則表示加鎖成功,但是jedis早期不支持add函數中添加過期時間,所以就有了expire這個方法, 但是兩步操作造成不是原子性的,後面更新後可以直接用add方法,也可以執行Lua腳本

後續會講講zk 和 redlock(redis集羣下的鎖)以及分佈式鎖的應用和優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章