分布式鎖的實現

2021-10-24 23:22:25 字數 3695 閱讀 6438

場景:由於我們是使用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實現分布式鎖.第一種 基於資料庫實現分布式鎖 特點 效能較差,容易出現單點故障 鎖沒有失效時間,容易思死鎖 非阻塞式的 不可重入 第二種基於快取實現分布式鎖 鎖沒有失效時間,容易...