網(wǎng)站首頁 編程語言 正文
RedisTemplate由于沒有setnx指令,所以需要自定義腳本時(shí)間
?一、請直接復(fù)制
package com.zy.base.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* redis 工具類
* @Author ZhangYi
*/
@Component
@Slf4j
public class RedisUtil {
@Resource
private RedisTemplate redisTemplate;
/**
* lua 腳本
*/
public static final String SETNX_SCRIPT = "return redis.call('setnx',KEYS[1], ARGV[1])";
/**
* redis實(shí)現(xiàn)分布式鎖
* @param key
* @return
*/
public boolean setNx(String key,int time) {
//自定義腳本
DefaultRedisScript script = new DefaultRedisScript<>(SETNX_SCRIPT, List.class);
//執(zhí)行腳本,傳入?yún)?shù),由于value沒啥用,這里隨便寫死的"1"
List rst = redisTemplate.execute(script, Collections.singletonList(key), "1");
//返回1,表示設(shè)置成功,拿到鎖
if(rst.get(0) == 1){
log.info(key+"成功拿到鎖");
//設(shè)置過期時(shí)間
expire(key,time);
log.info(key+"已成功設(shè)置過期時(shí)間:"+time +" 秒");
return true;
}else{
long expire = getExpire(key);
log.info(key+"未拿到到鎖,還有"+expire+"釋放");
return false;
}
}
/**
* 指定緩存失效時(shí)間
*
* @param key 鍵
* @param time 時(shí)間(秒)
* @return
*/
public void expire(String key, long time) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
/**
* 根據(jù)key 獲取過期時(shí)間
*
* @param key 鍵 不能為null
* @return 時(shí)間(秒) 返回0代表為永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 刪除緩存
*
* @param key 可以傳一個(gè)值 或多個(gè)
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));
}
}
}
}
二、使用栗子
redisUtil.setNx("zyLock1",5);
過期時(shí)間是為了防止死鎖,當(dāng)業(yè)務(wù)執(zhí)行完畢,刪除key釋放鎖
原文鏈接:https://zhangyi520.blog.csdn.net/article/details/124926230
相關(guān)推薦
- 2022-10-18 Python中尋找數(shù)據(jù)異常值的3種方法_python
- 2022-01-21 【每天一個(gè) Linux 命令】Linux命令 mkdir,cat,touch,vi/vim
- 2022-06-01 STL中vector的使用你了解嗎_C 語言
- 2021-12-07 Linux系統(tǒng)的修復(fù)模式(單用戶模式)_Linux
- 2022-11-06 關(guān)于useEffect的第二個(gè)參數(shù)解讀_React
- 2022-11-01 R語言在散點(diǎn)圖中添加lm線性回歸公式的問題_R語言
- 2022-01-18 利用css3實(shí)現(xiàn)立體旋轉(zhuǎn)動(dòng)畫效果
- 2022-10-24 Python?NumPy教程之索引詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支