基于spring-data-redis的RedisTemplate 和 lua 脚本的 redis 分布式锁的实现

本文介绍了使用SpringBoot的RedisTemplate和lua脚本实现Redis分布式锁的方法,强调了加锁的原子性、防止死锁、线程唯一解锁以及容错性。通过设置过期时间和lua脚本的set命令确保锁的安全性,并提供了相关测试代码和资源链接。
摘要由CSDN通过智能技术生成

基于 RedisTemplate 和 lua 脚本的 redis 分布式锁的实现

分布式锁一般的实现方法有三种:基于数据库锁。(行级锁如唯一约束或乐观锁的版本号方式),基于redis 的分布式锁
和基于zookeeper 的分布式锁。网上有很多关于 redis 分布式锁的实现,本文介绍的是基于 redis 锁的一种简单易用实现方式:基于 spring-data-redis 的RedisTemplate 的实现方式。
实现分布式锁要满足的几个条件:

  1. 锁的特性:在任一时刻,只能有一个线程持有锁。
  2. 不能死锁:即使持锁线程崩溃没有主动释放锁也不会影响其他线程持续阻塞。基于redis 过期时间能很好的避免这个问题。
  3. 只有加锁的线程才能解锁,其他线程不能强制抢占锁,即:强制把别的线程的锁释放。
  4. 能容错:部分redis节点挂了,不会造成所有任务中止。
  5. 加锁操作必须是原子操作(网上有些基于java 的实现先set再del是不严谨的)

代码实现

  1. 首先,自定义一个RedisTemplate, 替换 spring boot 默认装载的 redisTemplate , 因为默认的redisTemplate 序列化用的是 Jackson2JsonRedisSerializer,序列化与反序列化过程中会出现格式问题)
@Bean
public RedisTemplate<String, Serializable> redisTemplateDemo(RedisConnectionFactory redisConnectionFactory) {
   
	RedisTemplate<String, Serializable> template = new RedisTemplate<>();
	template.setConnectionFactory(redisConnectionFactory);
	// 使用 Jackson2JsonRedisSerializer 替换默认序列化
	Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
	ObjectMapper om = new ObjectMapper();
	om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
	om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
	jackson2JsonRedisSerializer.setObjectMapper(om);
	// 字符串序列化器
	StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
	// 普通Key设置为字符串序列化器
	template.setKeySerializer(stringRedisSerializer);
	// Hash结构的key设置为字符串序列化器
	template.setHashKeySerializer(stringRedisSerializer);
	// 普通值和hash的值都设置为jackson序列化器
	template.setValueSerializer(jackson2JsonRedisSerializer);
	template.setHashValueSerializer(jackson2JsonRedisSerializer);
	template.afterPropertiesSet();
	return template;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值