redisson+springboot 实现分布式锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redisson+springboot 实现分布式锁相关的知识,希望对你有一定的参考价值。
参考技术A 在一些场景时,需要保证数据的不重复,以及数据的准确性,特别是特定下,某些数据的准确性显得尤为重要,所以这个时候要保证某个方法同一时刻只能有一个线程执行。在单机情况下可以用jdk的乐观锁进行保证数据的准确性。而在分布式系统中,这种jdk的锁就无法满足这种场景。所以需要使用redssion实现分布式锁,它不仅可以实现分布式锁,也可以在某些情况下保证不重复提交,保证接口的幂等性。
redisson是基于redis实现的分布式锁,因为redis执行命令操作时是单线程,所以可以保证线程安全。当然还有其他实现分布式锁的方案,例如zk,MongoDB等。
首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:
模拟200个并发测试
结果:
没有库存变成负数的情况,说明分布式锁已生效
springboot整合redisson分布式锁
一、通过maven引入redisson的jar包
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.6.5</version> </dependency>
二、在yaml文件中引入redis的相关配置(redis单节点可以读取原有redis配置拼装,如果是主从需另外独立配置,相关属性可以参考org.redisson.config.Config.masterSlaveServersConfig)
spring: redis: host: 127.0.0.1 port: 6379 password: 111111
三、添加springboot配置
package com.aoxun.config; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * redisson配置 * 目前使用的是腾讯云的单节点redis,所以暂时配置单服务 * * */ @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private String port; @Value("${spring.redis.password}") private String password; @Bean public RedissonClient getRedisson(){ Config config = new Config(); config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password); //添加主从配置 // config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""}); return Redisson.create(config); } }
四、在需要使用的地方注入RedissonClient即可
package com.aoxun.modular.menjin.service.impl; import java.util.concurrent.TimeUnit; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class TestRedissonLock{ @Autowired private RedissonClient redissonClient; public void cameraCallback() { RLock rlock = redissonClient.getLock("redisson:lock:personId" + 123);
//设置锁超时时间,防止异常造成死锁 rlock.lock(20, TimeUnit.SECONDS); try{ //执行业务逻辑 Thread.sleep(10000); System.out.println(123); } catch(Exception e){ }finally{ rlock.unlock(); } } }
到此利用redisson实现分布式锁简单样例已经结束
以上是关于redisson+springboot 实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章