實踐基於redis的分布式鎖實現

2021-09-01 07:45:04 字數 2135 閱讀 3005

當多個機器(多個程序)會對同一條資料進行修改時,並且要求這個修改是原子性的。這裡有兩個限定:(1)多個程序之間的競爭,意味著jdk自帶的鎖失效;(2)原子性修改,意味著資料是有狀態的,修改前後有依賴。

分布式鎖一般有三種實現方式:1. 資料庫樂觀鎖;基於version欄位實現,樂觀鎖,兩個執行緒可以同時讀取到原有的version值,但是最終只有乙個可以完成操作;

2. 基於redis的nx ex引數的分布式鎖

3. 基於zookeeper的分布式鎖。

本篇部落格將介紹第二種方式,基於redis實現分布式鎖。

1、pom.xml引入如下依賴

org.springframework.boot

spring-boot-starter-data-redis

2.0.6.release

2、加鎖

private static final string lock_success = "ok";

/*** setifabsent 函式, , 嘗試設定lockkey的值為lockvalue,

* 若成功則同時設定key的過期時間並返回true,否則返回false

* @author fxbin

* @param lockkey 鎖

* @param lockvalue 鎖標識

* @param expiretime 過期時間,單位 ms

* @return 是否獲取成功

*/public boolean trygetdistributedlock(string lockkey, string lockvalue, integer expiretime), 鎖標識:{}", lockkey, lockvalue);

redisscriptscript = new defaultredisscript<>(

"return redis.call('set',keys[1],argv[1],'nx','px',argv[2])", string.class);

string locked = (string) redistemplate.execute(script,

redistemplate.getstringserializer(),

redistemplate.getstringserializer(),

collections.singletonlist(lockkey),

lockvalue, string.valueof(expiretime));

return lock_success.equalsignorecase(locked);

}

3、解鎖

/**

* 釋放分布式鎖

* @author fxbin

* @param lockkey 鎖

* @param lockvalue 鎖標識

* @return 是否釋放成功

*/public boolean releasedistributedlock(string lockkey, string lockvalue), 鎖標識:{}", lockkey, lockvalue);

string script = "if redis.call('get', keys[1]) == argv[1] then return redis.call('del', keys[1]) else return 0 end ";

defaultredisscriptredisscript = new defaultredisscript<>();

redisscript.setscripttext(script);

redisscript.setresulttype(long.class);

long evalresult = redistemplate.execute(redisscript, collections.singletonlist(lockkey), lockvalue);

log.info("lua執行結果: {}", evalresult);

if (release_success.equals(evalresult))

return false;

}

Redis分布式鎖的實踐

首先說一下場景,不根據實際場景講的技術都是吹流弊,沒人反對吧,咳咳 醫院 需要盡量高效的顯示最新的資料,根據不同的科室設定不同的快取時間,因為科室的熱門程度也不一樣嘛,這裡本次只分享我學習的一些心得.思路 號源的快取是30分鐘,然後在第25的時候,如果還有患者訪問某個部門的號源,就開啟一條非同步執行...

基於redis的分布式鎖

public class redislock 加鎖 取到鎖加鎖,並返回值用於解鎖 取不到鎖則立即返回 1 param millitimeout 最長鎖定時間,超時後自動刪除鎖,避免死鎖 return public synchronized long lock long millitimeout lo...

基於 Redis 的分布式鎖

分布式鎖在分布式應用中應用廣泛,想要搞懂乙個新事物首先得了解它的由來,這樣才能更加的理解甚至可以舉一反三。首先談到分布式鎖自然也就聯想到分布式應用。在我們將應用拆分為分布式應用之前的單機系統中,對一些併發場景讀取公共資源時如扣庫存,賣車票之類的需求可以簡單的使用同步或者是加鎖就可以實現。但是應用分布...