Springboot中如何使用Redisson实现分布式锁浅析

作者:追风人聊Java 时间:2023-10-01 18:48:29 

前言

在分布式场景下为了保证数据最终一致性。在单进程的系统中,存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步(lock—synchronized),使其在修改这种变量时能够线性执行消除并发修改变量。但分布式系统是多部署、多进程的,开发语言提供的并发处理API在此场景下就无能为力了。

1. 概述

老话说的好:便宜没好货,有价值的商品,即使再贵,也有人会买。

言归正传,今天继续讨论有关“锁”的话题,synchronized 和 ReentrantLock 大家应该都非常熟悉了,但这两个锁,作用域仅限制于单个Tomcat,如果使用了 Tomcat 集群,这两个锁就不管用了。

此时我们就要引入分布式锁了,分布式锁的实现方式有很多,可以使用 Mysql 数据库实现,也可以使用 Zookeeper 实现,当然比较常用的还是使用 Redis 实现。

今天我们就来聊一下基于 Redis 的实现方式 —— Redisson。

Redisson是架设在redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

2. Redisson 在 Springboot 中的使用

2.1 引入依赖


<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-spring-boot-starter</artifactId>
   <version>3.16.3</version>
</dependency>

2.2 在 Springboot 配置中配置Redis

支持 Redis单体、Redis哨兵模式 和 Redis集群模式


spring:
 redis:
   host: 192.168.1.12
   port: 6379
   password: zhuifengren

2.3 Demo代码


@Autowired
   private RedissonClient redissonClient;

public void lock() {

RLock rLock = redissonClient.getLock("myLock");
       log.info("进入了方法");

try {
           // 加锁,30秒后自动释放锁
           rLock.lock(30, TimeUnit.SECONDS);
           log.info("获得了锁");

Thread.sleep(15000);

} catch (Exception ex) {
           log.error(ex.getMessage(), ex);
       } finally {
           // 释放锁
           rLock.unlock();
           log.info("释放了锁");
       }
   }

3. 综述

来源:https://www.cnblogs.com/w84422/p/15387160.html

标签:springboot,redisson,分布式锁
0
投稿

猜你喜欢

  • ThreadPoolExecutor中的submit()方法详细讲解

    2022-02-18 03:02:39
  • Java中将File转化为MultipartFile的操作

    2021-07-05 21:25:32
  • Android实现使用微信登录第三方APP的方法

    2021-06-09 00:05:02
  • Java利用HttpClient模拟POST表单操作应用及注意事项

    2023-11-29 23:48:01
  • C#中神器类BlockingCollection的实现详解

    2022-10-13 07:41:02
  • C# String Replace高效的实例方法

    2023-10-26 23:24:08
  • Springboot Vue实现单点登陆功能示例详解

    2023-11-05 00:29:11
  • 关于idea引入spring boot <parent></parent>父依赖标红问题

    2021-11-23 09:42:12
  • Android实现记住用户名和密码功能

    2023-10-06 13:02:07
  • Java 入门图形用户界面设计之单选按钮

    2023-08-29 13:40:02
  • Java动态脚本Groovy获取Bean技巧

    2023-08-21 19:41:15
  • Java实现简单酒店管理系统

    2023-02-22 12:41:21
  • 浅谈Java锁的膨胀过程以及一致性哈希对锁膨胀的影响

    2023-06-03 15:03:38
  • C#图像处理之边缘检测(Sobel)的方法

    2022-05-12 02:05:50
  • C#中定时任务被阻塞问题的解决方法

    2023-10-27 00:56:02
  • 关于Java中Json的各种处理

    2022-06-12 02:37:48
  • MyBatis整合Redis实现二级缓存的示例代码

    2022-02-06 15:41:24
  • C#读取静态类常量属性和值的实例讲解

    2022-04-15 16:37:34
  • PullToRefreshListView实现多条目加载上拉刷新和下拉加载

    2022-07-21 02:26:01
  • 使用ehcache三步搞定springboot缓存的方法示例

    2021-06-25 04:44:12
  • asp之家 软件编程 m.aspxhome.com