當多個機器(多個程序)會對同一條資料進行修改時,並且要求這個修改是原子性的。這裡有兩個限定:(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 的分布式鎖
分布式鎖在分布式應用中應用廣泛,想要搞懂乙個新事物首先得了解它的由來,這樣才能更加的理解甚至可以舉一反三。首先談到分布式鎖自然也就聯想到分布式應用。在我們將應用拆分為分布式應用之前的單機系統中,對一些併發場景讀取公共資源時如扣庫存,賣車票之類的需求可以簡單的使用同步或者是加鎖就可以實現。但是應用分布...