redis如何實現分布式鎖

redis如何實現分布式鎖

分布式鎖需要解決的問題

互斥性:任意時刻只能有一個客戶端擁有鎖,不能同時多個客戶端獲取

安全性:鎖只能被持有該鎖的用戶刪除,而不能被其他用戶刪除? ? ? ?(推薦學習:Redis視頻教程

死鎖:獲取鎖的客戶端因為某些原因而宕機,而未能釋放鎖,其他客戶端無法獲取此鎖,需要有機制來避免該類問題的發生

容錯:當部分節點宕機,客戶端仍能獲取鎖或者釋放鎖

如何通過redis實現分布式鎖:(非完善方法)

SETNX key value :如果key不存在,則創建并賦值

時間復雜度: 0(1)

返回值:設置成功,返回1;設置失敗,返回0。

但是此時我們獲取的key是長期有效的,所以我們應該如何解決長期有效的問題呢?

EXPIRE key seconds

設置key的生存時間,當key過期時(生存時間為0) ,會被自動刪除

缺點:原子性得不到滿足

下面是偽代碼

//該程序存在危險,如果執行到第二行就崩潰了,則此時key會被一直占用而無法被釋放 RedisService?redisService?=?SpringUtils.getBean(Redi?sService.class);? long?status?=?redisService.setnx(key,?"1"); if(status?==?1)?{ 	redisService.expire(key,?expire); 	//執行獨占資源邏輯 	doOcuppiedWork(); }

如何通過Redis實現分布式鎖:(正確方式)

SET?key?value?[EX?seconds]?[PX?milliseconds]?[NX|XX]

EX second :設置鍵的過期時間為second秒

PX millisecond :設置鍵的過期時間為millisecond毫秒

NX :只在鍵不存在時,才對鍵進行設置操作

XX:只在鍵已經存在時,才對鍵進行設置操作

SET操作成功完成時,返回OK ,否則返回nil

下面是偽代碼

RedisService?redisService?=?SpringUtils.getBean(RedisService.class);?. String?result?=?redisService.set(lockKey,?requestId,?SET_IF_NOT_EXIST,?SET_WITH_EXPIRE_TIME,?expireTime); if?("OK".equals(result))?{ 	//執行獨占資源邏輯 	doOcuppiedWork(); }

大量的key同時過期的注意事項

集中過期,由于清除大量的key很耗時,會出現短暫的卡頓現象

解放方案:在設置key的過期時間的時候,給每個key加上隨機值

更多Redis相關技術文章,請訪問Redis視頻教程欄目進行學習!

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享