java中redissonClient 分布式锁的使用
在集群的情况下,用户多次请求接口时,存入的内容可能会导致重复,这时候就可以使用分布式锁来限制
适用场景
分布式应用,分布式缓存,分布式回话管理,分布式服务(任务,延迟任务,执行器),分布式redis客户端
第一步:导入依赖
<!-- redis 分布式锁框架 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.5</version> </dependency>
第二步:配置连接redis
程序化配置方法
Config config = new Config(); //存放在哪个服务器的redisIP地址加redis端口号 config. useSingleServer().setAddress("127.0.0.1:6379"); RedissonClient redisson = Redisson.create(config);
验证是否连接成功
redisson.getConfig().toJSON().toString()
结果
{"singleServerConfig":{"idleConnectionTimeout":10000,"pingTimeout":1000,"connectTimeout":10000,"timeout":3000,"retryAttempts":3,"retryInterval":1500,"reconnectionTimeout":3000,"failedAttempts":3,"subscriptionsPerConnection":5,"address":"redis://127.0.0.1:6379","subscriptionConnectionMinimumIdleSize":1,"subscriptionConnectionPoolSize":50,"connectionMinimumIdleSize":10,"connectionPoolSize":64,"database":0,"dnsMonitoring":false,"dnsMonitoringInterval":5000},"threads":0,"nettyThreads":0,"codec":{"class":"org.redisson.codec.JsonJacksonCodec"},"codecProvider":{"class":"org.redisson.codec.DefaultCodecProvider"},"resolverProvider":{"class":"org.redisson.liveobject.provider.DefaultResolverProvider"},"redissonReferenceEnabled":true,"useLinuxNativeEpoll":false}
测试写法
public class LockExamples { public static void main(String[] args) throws InterruptedException { // 默认连接上127.0.0.1:6379 RedissonClient client = Redisson.create(); // RLock 继承了 java.util.concurrent.locks.Lock 接口 RLock lock = client.getLock("lock"); lock.lock(); System.out.println("lock acquired"); Thread t = new Thread(() -> { //获取锁,传入要锁的key RLock lock1 = client.getLock("lock"); //获取锁 lock1.lock(); System.out.println("lock acquired by thread"); //解锁 lock1.unlock(); System.out.println("lock released by thread"); }); t.start(); t.join(1000); lock.unlock(); System.out.println("lock released"); t.join(); client.shutdown(); } }
飞花令的写法
@Override @Transactional(rollbackFor = Exception.class) public FlyingFlowerV1Vo insert(FlyingFlowerReq flyingFlowerReq, String userId) throws Exception { //对进来的用户加锁 RLock userLock = redissonClient.getLock(RedissonKey.USER_ID + userId); try{ //尝试加锁, 最多等待1秒, 1000秒后自动解锁 boolean getUserLock = userLock.tryLock(1, 1000, TimeUnit.MILLISECONDS); if (getUserLock) { //业务逻辑的代码,通常在插入修改的操作方法上进行加锁 }catch (Exception e){ //提示 System.out.println("接令频繁"+ userId); throw new ResultInfo(ResultUtils.error("接令频繁,请稍后再试")); }finally { //解锁 if (userLock.isLocked()) { if (userLock.isHeldByCurrentThread()) { userLock.unlock(); } } } return null; }
到此这篇关于java中redissonClient 分布式锁的使用的文章就介绍到这了,更多相关java redissonClient 分布式锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java8如何利用Lambda快速生成map、多层嵌套map
这篇文章主要介绍了Java8如何利用Lambda快速生成map、多层嵌套map问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-09-09package打包一个springcloud项目的某个微服务报错问题
这篇文章主要介绍了package打包一个springcloud项目的某个微服务报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07SpringBoot @DS注解实现多数据源配置以及问题解决办法
这篇文章主要给大家介绍了关于SpringBoot @DS注解实现多数据源配置以及问题解决办法,所谓多数据源就是一个Java EE项目中采用了不同数据库实例中的多个库,或者是同一个数据库实例中的多个不同库,需要的朋友可以参考下2023-11-11spring boot之使用spring data jpa的自定义sql方式
这篇文章主要介绍了spring boot之使用spring data jpa的自定义sql方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
最新评论