直接上代码
package com.example.test2.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Collections;
@Component
public class RedisLock {
@Autowired
private StringRedisTemplate redisTemplate;
public Boolean lock(String key,String value,Long time){
Boolean lockStatus = redisTemplate.opsForValue().setIfAbsent(key,value, Duration.ofSeconds(time));
return lockStatus;
}
public Long unLock(String key,String value){
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
RedisScript redisScript = new DefaultRedisScript<>(luaScript,Long.class);
Long releaseStatus = redisTemplate.execute(redisScript, Collections.singletonList(key),value);
return releaseStatus;
}
}
锁的使用
@RequestMapping(value = "order")
public void addLock(){
String orderId = "111111";//订单id
// 锁的过期时间要根据业务处理时间分析
boolean lock = redisLock.lock(orderId,"12",1L);
// 如果获取到锁,执行业务
if(lock) {
System.out.println("业务代码");
}else {
System.out.println("返回友好提示");
}
long unlock = redisLock.unLock(orderId,"12");
// 主动解锁失败是否需要进行业务回退
// 锁的过期时间到了,主动解锁失败
if (unlock == 0){
// 根据业务分析这里是否需要回退,如果需要回退,自定义异常,触发事务,回退
}
System.out.println("解锁:"+unlock);
}
测试结果
业务代码 解锁:1



