分布式锁——Redisson
1.安装redis
a.由于官方是没有Windows版的,所以我们需要下载微软开发的redis,网址:https://github.com/MicrosoftArchive/redis/releases
b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.windows.conf,启动redis(关闭cmd窗口即停止)
2.导入pom依赖
<properties>......<!-- spring --><spring.version>5.1.1.RELEASE</spring.version><!-- log4j --><slf4j.version>1.7.18</slf4j.version><log4j.version>1.2.17</log4j.version></properties><dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- AOP --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.6</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.6</version></dependency><!-- 日志相关 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- redis --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.8.2</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.10.0</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.1.1.RELEASE</version></dependency></dependencies>
3.新建配置文件
a.新建spring.xml
<?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:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 自动扫描的包名 --><context:component-scan base-package="com.wode" /><!-- 开启AOP代理 --><aop:aspectj-autoproxy proxy-target-class="true" /><!--开启注解处理器 --><context:annotation-config></context:annotation-config><context:property-placeholder location="classpath:redis.properties"/><!-- Spring中引入其他配置文件 --><import resource="classpath*:/spring-redis.xml" /></beans>
b.新建spring-redis.xml
<?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:redisson="http://redisson.org/schema/redisson"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://redisson.org/schema/redissonhttp://redisson.org/schema/redisson/redisson.xsd"><!-- redis连接池 --><bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最大空闲数 --><property name="maxIdle" value="${redis.maxIdle}" /><!-- 连接时最大的等待时间(毫秒) --><property name="maxWaitMillis" value="${redis.maxWait}" /><!-- 最大连接数 --><property name="maxTotal" value="${redis.maxTotal}" /><!-- 在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的 --><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><!-- redis连接工厂 --><bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:database="${redis.database}" p:pool-config-ref="jedisConfig" /><!-- 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="hashKeySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/></property><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/></property><property name="hashValueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/></property></bean><!-- ========================================= Redisson ========================================= --><!--redisson配置的实例 单台redis机器配置 --><redisson:client id="redissonClient"><redisson:single-serveraddress="redis://127.0.0.1:6379"idle-connection-timeout="10000"ping-timeout="1000"connect-timeout="10000"timeout="3000"retry-attempts="3"retry-interval="1500"connection-minimum-idle-size="10"connection-pool-size="64"database="0"/></redisson:client></beans>
c.新建redis.properties
# 主机 redis.host=127.0.0.1 # 端口号 redis.port=6379 # 密码 一般不需要 redis.pass= redis.database=0 redis.maxIdle=5 redis.maxWait=60000 redis.maxTotal=500 redis.testOnBorrow=true
4.使用Redisson + Spring-Date-Redis
a.新建Redisson工具类
@Component public class LockManager {@Autowiredprivate RedissonClient redissonClient;public void lock(String key){RLock fairLock = redissonClient.getLock(key);fairLock.lock();}public void unlock(String key){RLock fairLock = redissonClient.getLock(key);fairLock.unlock();} }
b.新建Spring-Data-Redis工具类
@Component public class RedisManager {@Autowiredprivate RedisTemplate redisTemplate;/*** 普通缓存获取** @param key 键* @return 值*/public Object getCache(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入** @param key 键* @param value 值* @return true成功 false失败*/public boolean setCache(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}}
c.新建BeanFactory工具类
public class BeanFactoryUtil {private static ApplicationContext context;public static ApplicationContext getBeanFactory(String path){if (context == null) {synchronized (BeanFactoryUtil.class) {if (context == null) {if(! StringUtils.hasText(path)){context = new ClassPathXmlApplicationContext("spring.xml");}else{context = new ClassPathXmlApplicationContext(path);}}}}return context;}public static ApplicationContext getBeanFactory(){if (context == null) {synchronized (BeanFactoryUtil.class) {if (context == null) {context = new ClassPathXmlApplicationContext("spring.xml");}}}return context;}}
d.测试
public class App {public static final String COMMON_LOCK_KEY = "lockKey";public static final String COMMON_COUNT_KEY = "countKey";public static LockManager lock;public static RedisManager redisManager;public static void main( String[] args ){ApplicationContext applicationContext = BeanFactoryUtil.getBeanFactory();lock = (LockManager) applicationContext.getBean("lockManager");redisManager = (RedisManager) applicationContext.getBean("redisManager");redisManager.setCache(COMMON_COUNT_KEY, 0);Thread thread1 = new MyThread();thread1.setName("线程1");Thread thread2 = new MyThread();thread2.setName("线程2");thread1.start();thread2.start();}public static class MyThread extends Thread{@Overridepublic void run() {while(true){lock.lock(COMMON_LOCK_KEY);System.out.println("==============[" + this.getName() + "]开始==============");try {Thread.sleep(2000);int count = (int) redisManager.getCache(COMMON_COUNT_KEY);System.out.println("==============[" + this.getName() + "]计数: " + count + " ==============");redisManager.setCache(COMMON_COUNT_KEY, count + 1);}catch (Exception e){e.printStackTrace();}lock.unlock(COMMON_LOCK_KEY);System.out.println("==============[" + this.getName() + "]结束==============");}}} }
转载于:https://www.cnblogs.com/vettel0329/p/11262246.html
分布式锁——Redisson相关推荐
- 高性能分布式锁-redisson
RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...
- 分布式锁 - Redisson的看门狗(watchdog)机制
分布式锁 - Redisson的看门狗(watchdog)机制 前言 本篇文章从Redisson的加锁(tryLock)入手,带大家由源码来了解一下watchdog的自动延迟加锁操作,如果对Redis ...
- 分布式锁-Redisson快速入门
分布式锁-Redisson快速入门 一.引入依赖 二.配置Redisson客户端 三.使用Redisson的分布式锁 一.引入依赖 <dependency><groupId>o ...
- 分布式锁Redisson的使用
文章目录 高性能分布式锁-redisson的使用 1.官方文档 2.项目集成 3.配置Redisson 4.锁的获取和释放 5.业务逻辑中使用分布式锁 高性能分布式锁-redisson的使用 1.官方 ...
- 分布式锁redisson的使用 看门狗原理
redisson 能干嘛 为什么要用分布式锁 redisson ,不用分布式锁 redisson 我们需要解决哪些问题? 单机版的服务使用Synchronize和Lock是没问题的,如果一上集群,每个 ...
- Redis分布式锁Redisson
文章目录 分布式锁 不可重入Redis分布式锁 Redisson 快速入门 可重入的Redis分布式锁 Redisson的multiLock 分布式锁 分布式锁:满足分布式系统或集群模式下多进程可见并 ...
- redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制
Redisson简介 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式 ...
- 分布式锁-Redisson
目录 1.分布式并发问题 2.如何解决分布式并发问题呢 ? 3.使⽤Redis实现分布式锁-代码实现 4.解决因线程异常导致⽆法释放锁的问题 5.解决因t1过期释放t2锁的问题 6.看⻔狗机制 7.分 ...
- 缓存-分布式锁-Redisson简介整合
Redisson分布式 GitHub中文文档 概念:是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提 ...
最新文章
- 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装
- linux安装metasploit,centos如何安装metasploit
- Windows内核实验001 中断提权
- 华为mate9 android p,安卓手机为什么越用越卡?华为Mate9搭载EMUI 5.0告别卡顿
- vue调用数组_vue数组的运用
- 如何在C/C++中动态分配二维数组
- 创建Maven时生成的properties标签内容解释
- 2019新版《龙果学院Elasticsearch顶尖高手系列(高手进阶篇教程)》
- java 转义符 输出,Java转义字符怎么输出的
- NOI2022游记,未曾设想的道路
- 蓝牙控制风扇的c语言程序,蓝牙风扇速度控制器的制作图解
- Spring MVC拦截器(一)---定义,配置及单个拦截器执行流程
- 如何使网站被搜索引擎快速收录
- 【 源代码 】 用Devc++编写的一个万年历小应用(附带音乐)
- 通过云片网实现短信以及验证码的发送
- web 基础练习/设计专业课程导航(7)
- 人机对话seq2seq+attention_CodingPark编程公园
- 赛码网和牛客网python输入输出要求
- 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711
- ABAP ALV 删除按钮标准写法