場景:由於我們是使用springcloud中的分布式場景,在高併發的情況下,會對其進行加鎖操作,以下就是使用setnx來對其進行加鎖操作,
pom檔案依賴:
<
!--spring 測試-->
org.springframework.boot
spring-boot-starter-test
<
!-- 開啟web-->
org.springframework.boot
spring-boot-starter-web
<
!--springboot整合redis-->
org.springframework.boot
spring-boot-starter-data-redis
下面是對配置檔案中的內容:
server:
port: 8084
spring:
redis:
host: localhost
port: 6379 #redis中的埠號
具體的**實現流程:全域性鎖類:分布式鎖類的設計
/**
* @author: jason
* @create: 2020/10/11 16:37
* @description 全域性鎖類 主要有名稱與value值
*/@data
public class lock
}
分布式鎖類的設計:
@component
public class distributedlockhandler
/***嘗試獲取全域性鎖
* @param lock 鎖的名稱
* @param timeout 獲取鎖的超時時間,單位ms
* @return true 獲取成功, false 獲取失敗
*/public boolean trylock(lock lock, long timeout)
/*** 嘗試獲取全域性鎖
* @param lock 鎖的名稱
* @param timeout 獲取鎖的超時時間
* @param tryinterval 獲取成功 true 代表成功 false 代表失敗
* @return
*/public boolean trylock(lock lock, long timeout, long tryinterval)
/*** 嘗試獲取全域性鎖
* @param lock 鎖的名稱
* @param timeout 獲取鎖的超時時間
* @param tryinterval 嘗試間隔次數
* @param lockexpiretime 鎖的過期時間
* @return
*/public boolean trylock(lock lock, long timeout, long tryinterval, long lockexpiretime)
/*** 操作redis獲取全域性鎖
* @param lock 鎖的名稱
* @param timeout 獲取的超時時間
* @param tryinterval 多少ms嘗試一次
* @param lockexpiretime 獲取成功後鎖的過期時間
* @return true 獲取成功 false 獲取失敗
* @throws interruptedexception
* 其原理是:在判斷是否有key的基礎上,進行迴圈,只有當不存在key才對其進行加鎖操作,其他不對其進行任何操作
*/public boolean getlock(lock lock, long timeout, long tryinterval, long lockexpiretime)
long starttime = system.currenttimemillis();
doelse
//嘗試超過設定值之後直接跳出迴圈
if(system.currenttimemillis(
) - starttime > timeout)
try catch (interruptedexception e)
}while
(stringredistemplate.haskey(lock.getname()))
;return
false;}
/*** 釋放鎖方法
* @param lock
*/public void releaselock(lock lock)
}
但是這種方法redis不推薦,因為這是乙個耗時的操作影響效能
redis推薦使用redission鎖,具體的**流程:
首先是定義好乙個獲取鎖之後的介面 - 然後就是定義好分布式鎖的介面
pom檔案是對前面進行改造之後的只是新增乙個pom檔案:
<
!--redisson分布式鎖-->
org.redisson
redisson
3.7.0
```**分析:這種感覺更像一種設計模式
/** * @author: jason
* @create: 2020/10/12 20:13
* @description 獲取鎖之後的操作
*/public inte***ce aquiredlockworker
/** * @author: jason
* @create: 2020/10/12 20:14
* @description 分布式鎖的管理類
*/public inte***ce distributedlocker
@component
public class redislock implements distributedlocker
/***感覺更像一種設計模式一樣
* @param resourcename
* @param worker
* @param locktime
* @param
* @return
* @throws exception
*/@override
public t lock(string resourcename, aquiredlockworker worker, int locktime) throws exception finally
} throw new unabletoaquirelockexception();
}}/** * @author: jason
* @create: 2020/10/12 20:18
* @description 異常類
*/public class unabletoaquirelockexception extends runtimeexception
; public unabletoaquirelockexception(string message)
public unabletoaquirelockexception(string message, throwable cause)
}
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
分布式鎖實現
1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...
分布式鎖的實現
分布式鎖的實現方式通常有三種,第一種是基於資料庫實現分布式鎖,第二種是基於快取實現分布式鎖,第三種是基於zookeeper實現分布式鎖.第一種 基於資料庫實現分布式鎖 特點 效能較差,容易出現單點故障 鎖沒有失效時間,容易思死鎖 非阻塞式的 不可重入 第二種基於快取實現分布式鎖 鎖沒有失效時間,容易...