共計 1692 個字符,預(yù)計需要花費 5 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要講解了“redis 分布式鎖的實現(xiàn)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“redis 分布式鎖的實現(xiàn)原理是什么”吧!
借助于 redis 中的命令 setnx(key, value),key 不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送 setnx 命令,只有一個客戶端可以成功,返回 1(true);其他的客戶端返回 0(false)。
本教程操作環(huán)境:windows7 系統(tǒng)、Redis5.0.10 版、DELL G3 電腦。
分布式鎖的實現(xiàn)
隨著業(yè)務(wù)發(fā)展的需要,原單體單機部署的系統(tǒng)被演化成分布式集群系統(tǒng)后,由于分布式系統(tǒng)多線程、多進程并且分布在不同機器上,這將使原單機部署情況下的并發(fā)控制鎖策略失效,單純的 Java API 并不能提供分布式鎖的能力。為了解決這個問題就需要一種跨 JVM 的互斥機制來控制共享資源的訪問,這就是分布式鎖要解決的問題!
分布式鎖主流的實現(xiàn)方案:
基于數(shù)據(jù)庫實現(xiàn)分布式鎖
基于緩存(Redis 等)
基于 Zookeeper
這里,我們就基于 redis 實現(xiàn)分布式鎖。
基本實現(xiàn)
借助于 redis 中的命令 setnx(key, value),key 不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送 setnx 命令,只有一個客戶端可以成功,返回 1(true);其他的客戶端返回 0(false)。
主要使用 Redis Setnx 命令
在指定的 key 不存在時,為 key 設(shè)置指定的值
設(shè)置成功,返回 1。設(shè)置失敗,返回 0
redis EXISTS job # job 不存在
(integer) 0
redis SETNX job programmer # job 設(shè)置成功
(integer) 1
redis SETNX job code-farmer # 嘗試覆蓋 job ,失敗
(integer) 0
redis GET job # 沒有被覆蓋
programmer
java 代碼
public void testLock() {
// 執(zhí)行 redis 的 setnx 命令
String uuid = UUID.randomUUID().toString();
Boolean lock = redisTemplate.opsForValue().setIfAbsent( lock , uuid, 5, TimeUnit.SECONDS);
// 判斷是否拿到鎖
if (lock) {
// 執(zhí)行業(yè)務(wù)邏輯代碼
// ...
// 釋放鎖資源 (保證獲取值和刪除操作的原子性) LUA 腳本保證刪除的原子性
String script = if redis.call(get , KEYS[1]) == ARGV[1] then
return redis.call(del , KEYS[1]) else return 0 end
this.redisTemplate.execute(new DefaultRedisScript (script),
Arrays.asList(lock), Arrays.asList(uuid));
// if (StrUtil.equals(uuid,redisTemplate.opsForValue().get(lock))){// redisTemplate.delete( lock} else {
// 其他請求嘗試獲取鎖
testLock();}
為了確保分布式鎖可用,我們至少要確保鎖的實現(xiàn)同時滿足以下四個條件:
互斥性。在任意時刻,只有一個客戶端能持有鎖。
不會發(fā)生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續(xù)其他客戶端能加鎖。
解鈴還須系鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。
感謝各位的閱讀,以上就是“redis 分布式鎖的實現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對 redis 分布式鎖的實現(xiàn)原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
向 AI 問一下細節(jié)