『Redis』什么是分布式鎖?如何實現?


分布式鎖問題

相關視頻教程(來自動力節點):https://www.bilibili.com/video/BV1Uz4y1X72A

相關資料下載:http://www.bjpowernode.com/?cnblogs

一、什么是分布式鎖?

要介紹分布式鎖,首先要提到與分布式鎖相對應的是線程鎖、進程鎖。

  • 線程鎖:主要用來給方法、代碼塊加鎖。當某個方法或代碼使用鎖,在同一時刻僅有一個線程執行該方法或該代碼段。線程鎖只在同一JVM中有效果,因為線程鎖的實現在根本上是依靠線程之間共享內存實現的,比如synchronized是共享對象頭,顯示鎖Lock是共享某個變量(state)。
  • 進程鎖:為了控制同一操作系統中多個進程訪問某個共享資源,因為進程具有獨立性,各個進程無法訪問其他進程的資源,因此無法通過synchronized等線程鎖實現進程鎖。
  • 分布式鎖:當多個進程不在同一個系統中,用分布式鎖控制多個進程對資源的訪問。

二、分布式鎖的使用場景

線程間並發問題和進程間並發問題都是可以通過分布式鎖解決的,但是強烈不建議這樣做!因為采用分布式鎖解決這些小問題是非常消耗資源的!分布式鎖應該用來解決分布式情況下的多進程並發問題才是最合適的。有這樣一個情境,線程A和線程B都共享某個變量X。

如果是單機情況下(單JVM),線程之間共享內存,只要使用線程鎖就可以解決並發問題。

如果是分布式情況下(多JVM),線程A和線程B很可能不是在同一JVM中,這樣線程鎖就無法起到作用了,這時候就要用到分布式鎖來解決。

三、分布式鎖的實現

分布式鎖實現的關鍵是在分布式的應用服務器外,搭建一個存儲服務器,存儲鎖信息,這時候我們很容易就想到了Redis。首先我們要搭建一個Redis服務器,用Redis服務器來存儲鎖信息。

在實現的時候要注意的幾個關鍵點:

1、鎖信息必須是會過期超時的,不能讓一個線程長期占有一個鎖而導致死鎖;

2、同一時刻只能有一個線程獲取到鎖。

幾個要用到的redis命令:

  • setnx(key, value):“set if not exits”,若該key-value不存在,則成功加入緩存並且返回1,否則返回0。
  • get(key):獲得key對應的value值,若不存在則返回nil。
  • getset(key, value):先獲取key對應的value值,若不存在則返回nil,然后將舊的value更新為新的value。
  • expire(key, seconds):設置key-value的有效期為seconds秒。

分布式鎖的三種實現方式

  1. 數據庫樂觀鎖;

  2. 基於Redis的分布式鎖;

  3. 基於ZooKeeper的分布式鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM