spring集成redisson实现分布式锁

2024-05-13 08:08

本文主要是介绍spring集成redisson实现分布式锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。而Java提供的同步锁synchronized只能解决单台服务器上的并发问题,一般线上环境都是多台服务器部署同时运行,跨jvm的环境下synchronized的作用就不大了。这个时候redis就可以作为分布锁来使用了,一般都是基于redis setNx命令来实现自己的锁,建出来的键值一般都是有一个超时时间的(这个是Redis自带的超时特性),所以每个锁最终都会释放
这里介绍的是github上的一个开源项目,国外大神些的算法毕竟比自己实现的靠谱点项目源码地址,里面不光有分布锁,还有分布锁队列等等一系列模块
https://github.com/redisson/redissonpom.xml配置文件引人redisson相关包
<dependency><groupId>org.redisson</groupId><artifactId>redisson-all</artifactId><version>2.10.5</version>
</dependency>2. 配置方法2.1. 程序化配置方法Redisson程序化的配置方法是通过构建Config对象实例来实现的。例如:public class RedissonUtils {private static RedissonClient redissonClient;static{Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword(null);redissonClient = Redisson.create(config);}public static RedissonClient getRedisson(){return redissonClient;}public static void main(String[] args) throws InterruptedException{RLock fairLock = getRedisson().getLock("TEST_KEY");System.out.println(fairLock.toString());
//      fairLock.lock(); // 尝试加锁,最多等待10秒,上锁以后10秒自动解锁boolean res = fairLock.tryLock(10, 10, TimeUnit.SECONDS);System.out.println(res);fairLock.unlock();//有界阻塞队列
//      RBoundedBlockingQueue<JSONObject> queue = getRedisson().getBoundedBlockingQueue("anyQueue");// 如果初始容量(边界)设定成功则返回`真(true)`,// 如果初始容量(边界)已近存在则返回`假(false)`。
//      System.out.println(queue.trySetCapacity(10));
//      JSONObject o=new JSONObject();
//      o.put("name", 1);
//      if(!queue.contains(o)){
//          queue.offer(o);
//      }//      JSONObject o2=new JSONObject();
//      o2.put("name", 2);// 此时容量已满,下面代码将会被阻塞,直到有空闲为止。//      if(!queue.contains(o2)){
//          queue.offer(o2);
//      }//      //  获取但不移除此队列的头;如果此队列为空,则返回 null。
//      JSONObject obj = queue.peek();
//      //获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。
//      JSONObject ob = queue.poll(10, TimeUnit.MINUTES);                                                    //获取并移除此队列的头,如果此队列为空,则返回 null。
//       Iterator<JSONObject> iterator=queue.iterator();
//       while (iterator.hasNext()){
//            JSONObject i =iterator.next();
//            System.out.println(i.toJSONString());
//            iterator.remove();
//          
//        }
//          while(queue.size()>0){
//              JSONObject ob = queue.poll();     
//              System.out.println(ob.toJSONString());
//          }
//      
//      JSONObject someObj = queue.poll();
//      System.out.println(someObj.toJSONString());}
2 spring集成的方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:redisson="http://redisson.org/schema/redisson" xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd  http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://redisson.org/schema/redissonhttp://redisson.org/schema/redisson/redisson.xsd"><context:component-scan base-package="component.controller.RedisServiceImpl" /><!-- redis连接池 -->  <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">          <property name="maxIdle" value="${redis_max_idle}"></property>   <property name="testOnBorrow" value="${redis_test_on_borrow}"></property>  </bean>  <!-- redis连接工厂 -->  <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  <property name="hostName" value="${redis_addr}"></property>  <property name="port" value="${redis_port}"></property>  <property name="password" value="${redis_auth}"></property>  <property name="poolConfig" ref="jedisConfig"></property>  </bean>  <!-- redis操作模板,这里采用尽量面向对象的模板 -->  <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  <property name="connectionFactory" ref="connectionFactory" />  <!--     如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->  <property name="keySerializer">  <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />  </property>  <property name="valueSerializer">  <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />  </property>  </bean>     <!--redisson配置的实例    单台redis机器配置    --><redisson:client id="redissonClient"><redisson:single-server address="redis://127.0.0.1:6379" connection-pool-size="30" />  </redisson:client>
</beans>引入RedissonClient就可以使用了
@Autowired  
private RedissonClient redissonClient;//获取redissson分布式锁RLock fairLock = redissonClient.getLock("TEST_KEY");       //尝试加锁 最多等待100秒 20秒后自动销毁
boolean res = fairLock.tryLock(100, 20, TimeUnit.SECONDS);//释放锁
fairLock.unlock();提醒:redis版本一定要3.0以上的 不然会报错,redis lua脚本

这篇关于spring集成redisson实现分布式锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985139

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——