清明在家无事,并且因为上海疫情原因只能宅在家里,突然想到之前计划着写一篇Redisson的分布式锁快速入门教程,自己平常在工作中也只能简单会使用,所以文章可能写的比较简单,希望大佬勿喷。此文章也作为个人的笔记,用于查漏补缺。
补充:目前只是使用Redisson作为分布式锁的用途。

概述

什么是Redisson呢?

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

这是官网对于Redisson的概述。

使用

首先,Redisson对于SpringBoot有对于的整合包,不过我们出于学习目的,先只引入Redisson

<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.0</version>
</dependency>

配置方法


我们在官方文档中看到有这么多的配置方法,我们先选择使用程序化配置方法进行Redisson的配置。我们可以在右侧Wiki Home里找到第三方框架整合,我们可以选择Spring Cache整合中提供的方式来进行配置

@Configuration
public class MyRedissonConfig {@Bean(destroyMethod = "shutdown")RedissonClient redisson() throws IOException {Config config = new Config();// 单Redis节点模式config.useSingleServer()// 这样配置是有问题的,请先看我下边的解释.setAddress("192.168.200.12:6379");return Redisson.create(config);}
}

如果我们直接这样写,一定会报出**Redis url should start with redis:// or rediss:// (for SSL connection)**这个错误,解决方式是我们需要把192.168.200.12:6379加上redis://rediss://,即redis://192.168.200.12:6379

可重入锁(Reentrant Lock)

 @GetMapping("/hello")@ResponseBodypublic String hello() {RLock lock = redisson.getLock("anyLock");// 最常见的使用方法lock.lock();System.out.println("获取锁");try {System.out.println("业务");Thread.sleep(15000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("解锁");lock.unlock();}return "hello";}

官网简介、redisson中的看门狗机制总结

大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。

另外Redisson还通过加锁的方法提供了leaseTime的参数来指定加锁的时间。超过这个时间后锁便自动解开了。

 @GetMapping("/hello")@ResponseBodypublic String hello() {RLock lock = redisson.getLock("anyLock");// 更推荐使用明显标注leaseTime的这种方式,可以省去延期锁lock.lock(10, TimeUnit.SECONDS);System.out.println("获取锁--" + Thread.currentThread().getId());try {System.out.println("业务--" + Thread.currentThread().getId());Thread.sleep(15000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("解锁--" + Thread.currentThread().getId());lock.unlock();}return "hello";}

当然,如果我们想设置最长等待时间的话。

 @GetMapping("/hello")@ResponseBodypublic String hello() throws InterruptedException {RLock lock = redisson.getLock("anyLock");// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {System.out.println("获取锁--" + Thread.currentThread().getId());try {System.out.println("业务--" + Thread.currentThread().getId());Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("解锁--" + Thread.currentThread().getId());lock.unlock();}}return "hello";}

读写锁(ReadWriteLock)

基于Redis的Redisson分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。其中读锁和写锁都继承了RLock接口。

分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。

大家都知道,如果负责储存这个分布式锁的Redis节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。

    @GetMapping("/read")@ResponseBodypublic String readValue() {RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");// 最常见的使用方法RLock rLock = rwlock.readLock();// 上锁rLock.lock();System.out.println("读锁" + Thread.currentThread().getId());String uuid = "";try {uuid = stringRedisTemplate.opsForValue().get("key");// 业务Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("解锁" + Thread.currentThread().getId());// 解锁rLock.unlock();}return uuid;}@GetMapping("/write")@ResponseBodypublic String writeValue() {RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");// 最常见的使用方法RLock rLock = rwlock.writeLock();// 上锁rLock.lock();System.out.println("写锁" + Thread.currentThread().getId());String uuid = "";try {uuid = UUID.fastUUID().toString();stringRedisTemplate.opsForValue().set("key", uuid);// 业务Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("解锁" + Thread.currentThread().getId());// 解锁rLock.unlock();}return uuid;}

信号量(Semaphore)

基于Redis的Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。

我们拿停车场作为例子,park为停车方法,go为离开停车场方法,当停车场的车位(semaphore)大于0时,可以随便停车,但是当车位(semaphore)等于0时,则park方法会一直阻塞到go方法被激活后停车场的车位(semaphore)大于0

    @GetMapping("/park")@ResponseBodypublic String park() throws InterruptedException {// 按名称返回信号量实例RSemaphore semaphore = redisson.getSemaphore("semaphore");// 获得许可。如有必要,等待许可证可用。semaphore.acquire();return "park";}@GetMapping("/go")@ResponseBodypublic String go() {// 按名称返回信号量实例RSemaphore semaphore = redisson.getSemaphore("semaphore");// 发放许可证。增加可用许可证的数量。semaphore.release();return "go";}

如果我们不想一直让park方法阻塞的话,可以使用以下方式

 @GetMapping("/park")@ResponseBodypublic String park() {// 按名称返回信号量实例RSemaphore semaphore = redisson.getSemaphore("semaphore");// 尝试获取当前可用的许可证。// 如果获得了许可,则为true ,否则为falseboolean flag = semaphore.tryAcquire();if (flag) {// 业务} else {// 业务}return "park--" + flag;}

闭锁(CountDownLatch)

基于Redisson的Redisson分布式闭锁(CountDownLatch)Java对象RCountDownLatch采用了与java.util.concurrent.CountDownLatch相似的接口和用法。

我们可以拿放学这个例子来说明闭锁,当所有的班级全部锁门之后,学校才可以锁门。

    @GetMapping("/lockSchool")@ResponseBodypublic String lockSchool() throws InterruptedException {// 按名称返回 countDownLatch 实例。RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");// 仅当先前的计数已达到零或根本未设置时才设置新的计数值。latch.trySetCount(5);// 等到计数器达到零。latch.await();return "放学啦";}@GetMapping("/afterSchool")@ResponseBodypublic String afterSchool() {// 按名称返回 countDownLatch 实例。RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");// 减少锁存器的计数器。当计数达到零时通知所有等待线程。latch.countDown();return "走了一个班";}

Redisson分布式锁快速入门教程相关推荐

  1. Redisson分布式锁轻松入门实战与讲解

    文章目录 一.Redisson 是什么? 二.整合 Redisson 2.1 引入 Maven 依赖 2.2 自定义配置类 2.3 测试配置类 三.分布式可重入锁 3.1 可重入锁测试 3.1.1 验 ...

  2. Redis实战——Redisson分布式锁

    目录 1 基于Redis中setnx方法的分布式锁的问题 2 Redisson 2.1 什么是Redisson 2.2 Redisson实现分布式锁快速入门 2.3 Redisson 可重入锁原理 什 ...

  3. redisson分布式锁,实战

    目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...

  4. Redisson分布式锁详解

    概述 setnx分布式锁的问题 重入问题 重入问题是指获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,它的方法都是使用synchroniz ...

  5. 年轻人,看看Redisson分布式锁—可重入锁吧!太重要了

    1.引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面试中的宠儿,也是工作中解决一些特定场景下的技术问题的银弹.今天我们就来聊聊这些银弹中的其中一枚 ...

  6. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了

    作者 | 李祥    责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...

  7. springboot基础(72):Redisson分布式锁

    文章目录 前言 第一节 入门使用Redisson 第二节 注解形式的分布式锁 1. 分布式锁的注解实现 2. 分析MyRedissonLock注解和使用 传送门 前言 并发执行是比较场景的场景,单机情 ...

  8. redis快速入门教程

    原文链接:redis快速入门教程 redis是什么 redis的作者何许人也 谁在使用redis 学会安装redis 学会启动redis 使用redis客户端 redis数据结构 – 简介 redis ...

  9. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

最新文章

  1. 使用Docx4j操作PPT指南系列(附一)
  2. 儿童python编程入门-天津少儿编程Python入门
  3. 从闲扯开始我的技术博客吧
  4. 真香!用 4K 高清显示器写代码,包邮送一台!
  5. Ext 入门 (05) 打印+gridpanel()方法
  6. 关于图片预加载的思考
  7. 在PyTorch中转换数据
  8. STM32 网络通信Web Server中 SSI与CGI的应用解析
  9. java 递归遍历对象所有属性_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...
  10. 使用Python创建一个系统监控程序
  11. class括号里的object_听说你在找python中class的定义及使用教程?看这里就对了
  12. 造车梦又要“窒息”了?贾跃亭被美国认定骗局,收到退市警告!FF回应了......
  13. 学习实践:使用模式,原则实现一个C++自动化测试程序
  14. 庆贺:上传资源时已支持不允许动态调分
  15. 面试怪事:网上抄答案的程序员
  16. 除了秀米,微信排版还有什么好用的? ---短网址
  17. 2007 word打开无响应
  18. 获取小游戏SWF文件中的素材
  19. 行走在网格之间:微博用户关系模型
  20. 疾病抗争从未停止,糖尿病数据可视化分析

热门文章

  1. 三马争霸消费积分 腾讯强化大数据布局
  2. 最近终于打算买车了,说说自己的想法。
  3. 韩国6月28日起实施网络实名制
  4. 杰理之APP概述【篇】
  5. 在ie下a标签的download
  6. 《QDebug 2022年5月》
  7. C#-----委托delegate的定义与使用
  8. 会声会影(VideoStudio Pro X6)安装了现错误-9解决方法
  9. 使用E-mailCrack破解邮箱密码案例
  10. 微信摇一摇(copy的)