import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* 基于redis setnx 解决集群环境下 任务调度 重复执行问题
*
* @Author wzt
* @Date 2024/04/09 6:21
* @Version 1.0
*/
@Component
@SuppressWarnings(value={"unchecked", "rawtypes"})
public class RedisLockUtil {
@Autowired
private RedisTemplate redisTemplate;
// redis中key前缀
public final static String TASK_LOCK_KEY = "yzsd_lock_job:";
/**
* 上锁
*
* @param key
* @param timeout 键值对缓存的时间,单位是秒
* @return 设置成功返回true,否则返回false
*/
public boolean checkLock(String key, Object value, long timeout) {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
key = TASK_LOCK_KEY+key;
//底层调用setnx方法
boolean isSuccess = redisTemplate.opsForValue().setIfAbsent(key, value);
if (isSuccess) {
//设置分布式锁的过期时间
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
return isSuccess;
}
/**
* 释放锁
* @param key
* @return
*/
public boolean delLock(String key) {
key = TASK_LOCK_KEY+key;
Boolean isSuccess = redisTemplate.delete(key);
return isSuccess;
}
}
redis锁
最新推荐文章于 2025-05-20 18:24:14 发布