網路看到很多各種方式的redis鎖的使用,但是都無法避免原子操作的保證,看到很多各種麻煩的方式,很難實作,而且存在各種問題,redis自己提供了安全的原子操作加鎖方式,
redis命令:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds : 將鍵的過期時間設定為 seconds 秒, 執行 SET key value EX seconds 的效果等同于執行 SETEX key seconds value ,
PX milliseconds : 將鍵的過期時間設定為 milliseconds 毫秒, 執行 SET key value PX milliseconds 的效果等同于執行 PSETEX key milliseconds value ,
NX : 只在鍵不存在時, 才對鍵進行設定操作, 執行 SET key value NX 的效果等同于執行 SETNX key value ,
XX : 只在鍵已經存在時, 才對鍵進行設定操作
java中的使用:
參考spring-boot依賴,使用RedisTemplate.java類
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 嘗試獲取鎖,執行緒安全的鎖獲取
* outTime 設定超時時間,timeUnit 超時時間的單位 建議秒和毫秒
* @return true 獲取鎖成功, false 獲取鎖失敗
*/
public Boolean tryLock(String lockKey, Object value, long outTime, TimeUnit timeUnit){
try {
ValueOperations realValueOperations = redisTemplate.opsForValue();
Boolean status = realValueOperations.setIfAbsent(lockKey, value, outTime, timeUnit);
return status;
}catch (Exception e){
// redis自身例外,并列印例外堆疊
return false;
}
}
/**
* 鎖釋放
* @return true 獲取鎖成功, false 獲取鎖失敗
*/
public Boolean releaseLock(String lockKey){
try {
return redisTemplate.delete(lockKey);
}catch (Exception e){
// redis自身例外,并列印例外堆疊
return false;
}
}
ps:面試的時候,很多老的程式員都問怎么保證原子操作的,每次說set方法可以保證,這些人都一臉懵,redis自身已然提供了完善、簡單的原子操作命令,相應的方法自然在java的內庫中也存在,何必一直問這個問題呢,說了你還沒聽過,還說我不會...時代已經不再是處于setNX和Lua語言的時代了,大人,時代變了,下次再面試,遇到了直接代碼糊臉上
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/292255.html
標籤:其他
上一篇:mysql表磁區的使用和底層原理
