Spring data redis 設定分布式鎖

2021-09-26 10:31:59 字數 1621 閱讀 3365

分布式鎖設定不當會導致的問題:

專案中運用"spring-data-redis"或者"spring-boot-starter-data-redis",通常是通過redistemplate類操作redis。這裡介紹通過redis設定分布式鎖的具體過程。

獲取分布式鎖

private redistemplateredistemplate;

/** * 嘗試在一定等待時間內獲取帶過期時間的全域性鎖

** @param mutexkey 鎖key

* @param mutexval 鎖val,建議uuid

* @param ttl 鎖過期時間

* @param timeunit 鎖過期時間單位

* @param waitmilsec 等待毫秒,若 <=0,則一直阻塞等待獲得鎖

* @return 是否獲取到全域性鎖

*/private boolean getlockwithexpire(string mutexkey, string mutexval, long ttl, timeunit timeunit, long waitmilsec)

try catch (interruptedexception e)

now = system.currenttimemillis();

}return boolean.valueof(true).equals(isset);

}

關鍵是運用redis的setnx命令,不同的客戶端(jedis/lettuce)或有不同的api,spring對其做了統一的封裝,並遮蔽了獲取連線、釋放連線、異常處理的具體細節,就像spring封裝其它持久層框架一樣。目前看來,redistemplate能夠實現大部分操作redis的需求。

redis 2.6.12版本後,set命令增加了多個可選引數:

set key value [expiration ex seconds|px milliseconds] [nx|xx]
expiration:過期時間,ex 秒、px毫秒;

nx:not exist;

xx:exist;

例如,在key=name不存在時,設定value=tom,同時過期時間為60秒:set name tom ex 60 nx

通過這個命令,避免了setnx+expire實現分布式鎖時出現的bug。

2. 釋放分布式鎖

/**

* 釋放全域性鎖

** @param mutexkey 鎖key

* @param mutexval 鎖val

* @return 當前執行緒是否成功釋放全域性鎖

*/private boolean releaselock(string mutexkey, string mutexval)

釋放鎖需要兩步:先檢查當前程序是否持有鎖,再執行刪除。目前只能通過lua指令碼實現操作的acid。

3. redis官方推薦的分布式鎖

以上能在單節點redis實現簡單的分布式鎖,在多節點redis、高併發情況下,會暴露很多問題。redis官方推薦採用redlock。the redlock algorithm

**倉庫

spring data redis簡單演示

專案需要將jedis整合到spring中,正好spring專案中包括了spring data redis專案,並對jedis進行了封裝。極大的方便了redis的操作。所需的基本包 spring的配置檔案中加入redis的配置 配置好後就可以直接在專案中使用redistemplate和stringre...

spring data redis 基本使用

stringredistemplate.opsforvalue set test 100 60 10,timeunit.seconds 向redis裡存入資料和設定快取時間 stringredistemplate.opsforvalue get test 根據key獲取快取中的val stringr...

Spring Data Redis 正確使用姿勢

課程簡介 本課程主要講解常規 redis 的寫法,redis 和 spring 的結合使用,即 spring data redis,以及 redis 在工作中的正確使用姿勢,redis 和 spring 的 cacheable 的結合使用。裡面貫穿了基本使用方法和工作實踐結合在實際工作中的寫法,起到...