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相关推荐

  1. 高性能分布式锁-redisson

    RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...

  2. 分布式锁 - Redisson的看门狗(watchdog)机制

    分布式锁 - Redisson的看门狗(watchdog)机制 前言 本篇文章从Redisson的加锁(tryLock)入手,带大家由源码来了解一下watchdog的自动延迟加锁操作,如果对Redis ...

  3. 分布式锁-Redisson快速入门

    分布式锁-Redisson快速入门 一.引入依赖 二.配置Redisson客户端 三.使用Redisson的分布式锁 一.引入依赖 <dependency><groupId>o ...

  4. 分布式锁Redisson的使用

    文章目录 高性能分布式锁-redisson的使用 1.官方文档 2.项目集成 3.配置Redisson 4.锁的获取和释放 5.业务逻辑中使用分布式锁 高性能分布式锁-redisson的使用 1.官方 ...

  5. 分布式锁redisson的使用 看门狗原理

    redisson 能干嘛 为什么要用分布式锁 redisson ,不用分布式锁 redisson 我们需要解决哪些问题? 单机版的服务使用Synchronize和Lock是没问题的,如果一上集群,每个 ...

  6. Redis分布式锁Redisson

    文章目录 分布式锁 不可重入Redis分布式锁 Redisson 快速入门 可重入的Redis分布式锁 Redisson的multiLock 分布式锁 分布式锁:满足分布式系统或集群模式下多进程可见并 ...

  7. redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制

    Redisson简介 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式 ...

  8. 分布式锁-Redisson

    目录 1.分布式并发问题 2.如何解决分布式并发问题呢 ? 3.使⽤Redis实现分布式锁-代码实现 4.解决因线程异常导致⽆法释放锁的问题 5.解决因t1过期释放t2锁的问题 6.看⻔狗机制 7.分 ...

  9. 缓存-分布式锁-Redisson简介整合

    Redisson分布式 GitHub中文文档 概念:是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提 ...

最新文章

  1. 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装
  2. linux安装metasploit,centos如何安装metasploit
  3. Windows内核实验001 中断提权
  4. 华为mate9 android p,安卓手机为什么越用越卡?华为Mate9搭载EMUI 5.0告别卡顿
  5. vue调用数组_vue数组的运用
  6. 如何在C/C++中动态分配二维数组
  7. 创建Maven时生成的properties标签内容解释
  8. 2019新版《龙果学院Elasticsearch顶尖高手系列(高手进阶篇教程)》
  9. java 转义符 输出,Java转义字符怎么输出的
  10. NOI2022游记,未曾设想的道路
  11. 蓝牙控制风扇的c语言程序,蓝牙风扇速度控制器的制作图解
  12. Spring MVC拦截器(一)---定义,配置及单个拦截器执行流程
  13. 如何使网站被搜索引擎快速收录
  14. 【 源代码 】 用Devc++编写的一个万年历小应用(附带音乐)
  15. 通过云片网实现短信以及验证码的发送
  16. web 基础练习/设计专业课程导航(7)
  17. 人机对话seq2seq+attention_CodingPark编程公园
  18. 赛码网和牛客网python输入输出要求
  19. 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711
  20. ABAP ALV 删除按钮标准写法

热门文章

  1. 洛谷 P1823 [COI2007] Patrik 音乐会的等待
  2. 关于药家鑫案人个看法
  3. C++ 两个矩阵的乘法
  4. 抖音上的时钟屏保,被我改造完用来表白
  5. 选择样式的日期时间js代码
  6. 台式计算机如何升级,台式电脑怎样升级系统
  7. 俄罗斯方块实验报告(附源码)
  8. 前端工程化实践:从开发到构建测试部署——由此及彼
  9. 惯量辨识c语言程序设计,异步电机参数在线辨识技术的(硬件部分)毕业设计.doc...
  10. 对象与对象变量 LJY第二周