redis分佈式鎖?坑那麼多

redis分佈式鎖?坑那麼多


一、白話分佈式

什麼是分佈式,用最簡單的話來說,就是爲了較低單個服務器的壓力,將功能分佈在不同的機器上面;

就比如:

本來一個程序員可以完成一個項目:需求->設計->編碼->測試
在這裏插入圖片描述

但是項目多的時候,一個人也扛不住,這就需要不同的人進行分工合作了

在這裏插入圖片描述
這就是一個簡單的分佈式協同工作了;


二、分佈式鎖

首先看一個問題,如果說某個環節被終止或者別侵佔,就會發生不可知的事情

在這裏插入圖片描述

這就會出現,設計好的或者設計的半成品會被破壞,導致後面環節出錯;

這時候,我們就需要引入分佈式鎖的概念;

何爲分佈式鎖?

  • 當在分佈式模型下,數據只有一份(或有限制),此時需要利用鎖的技術控制某一時刻修改數據的進程數。
  • 用一個狀態值表示鎖,對鎖的佔用和釋放通過狀態值來標識。

分佈式鎖的條件:

  • 可以保證在分佈式部署的應用集羣中,同一個方法在同一時間只能被一臺機器上的一個線程執行。
  • 這把鎖要是一把可重入鎖(避免死鎖)
  • 這把鎖最好是一把阻塞鎖
  • 這把鎖最好是一把公平鎖
  • 有高可用的獲取鎖和釋放鎖功能
  • 獲取鎖和釋放鎖的性能要好

分佈式鎖的實現:

​ 分佈式鎖的實現由很多種,文件鎖、數據庫、redis等等,比較多,在實踐中,還是redis做分佈式鎖性能會高一些;

三、redis實現分佈式鎖

首先看兩個命令:

**setnx:**將 key 的值設爲 value,當且僅當 key 不存在。 若給定的 key 已經存在,則 SETNX 不做任何動作。 SETNX 是SET if Not eXists的簡寫。

127.0.0.1:6379> set lock "unlock"
OK
127.0.0.1:6379> setnx lock "unlock"
(integer) 0
127.0.0.1:6379> setnx lock "lock"
(integer) 0
127.0.0.1:6379> 

expire: EXPIRE key seconds

爲給定 key 設置生存時間,當 key 過期時(生存時間爲 0 ),它會被自動刪除

127.0.0.1:6379> expire lock 10
(integer) 1
127.0.0.1:6379> ttl lock
8
127.0.0.1:6379> get lock
(nil)

基於分佈式鎖的流程:
在這裏插入圖片描述

這就是一個簡單的分佈式鎖的實現流程,具體代碼實現也很簡單,就不贅述了;

四、redis實現分佈式鎖問題

如果出現了這麼一個問題:如果setnx是成功的,但是expire設置失敗,那麼後面如果出現了釋放鎖失敗的問題,那麼這個鎖永遠也不會被得到,業務將被鎖死?

解決的辦法:使用set的命令,同時設置鎖和過期時間

set參數:

set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:設置失效時長,單位秒
PX milliseconds:設置失效時長,單位毫秒
NX:key不存在時設置value,成功返回OK,失敗返回(nil)
XX:key存在時設置value,成功返回OK,失敗返回(nil)

實踐:

127.0.0.1:6379> set unlock "234" EX 100 NX
(nil)
127.0.0.1:6379> 
127.0.0.1:6379> set test "111" EX 100 NX
OK

這樣就完美的解決了分佈式鎖的原子性;


想了解學習更多C++後臺服務器方面的知識,請關注:
1:6379> set test “111” EX 100 NX
OK


這樣就完美的解決了分佈式鎖的原子性;



***********************

想了解學習更多C++後臺服務器方面的知識,請關注:
微信公衆號:====**CPP後臺服務器開發**====

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200314184304213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RyYXZlbGVyd3o=,size_16,color_FFFFFF,t_70)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章