程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

  • 前端手册

  • 组件文档

  • 数据库分析

  • 集成插件

    • 集成 Docker 实现一键部署
    • 升级 Spring Boot 到 3.x 版本
    • 集成 Ehcache 实现本地缓存切换
    • 集成 WebSocket 实现实时通信
    • 集成 Electron 实现桌面应用程序
    • 集成 Atomikos 实现分布式事务
    • 集成 MinIO 实现分布式文件存储
    • 集成 Easy-ES 实现分布式全文检索
    • 使用 `localStorage` 代替 `cookie`
    • 使用 Undertow 替代 Tomcat 容器
    • 集成 Actuator 实现优雅关闭应用
    • 集成 AJ-Captcha 实现滑块验证码
    • 集成 Sharding-JDBC 实现分库分表
    • 集成 JustAuth 实现第三方授权登录
    • 集成 `watermark-dom` 实现页面水印
    • 集成 MyBatis-Plus 实现 MyBatis 增强
    • 集成 EasyExcel 实现 Excel 表格增强
    • 集成 Knife4j 实现 Swagger 文档增强
    • 集成 Redisson 实现 Redis 分布式锁
      • 1. 引入 Redisson 依赖
      • 2. 创建 RedisLock 工具类
      • 3. 配置 RedissonConfig 类
      • 4. 使用方式
      • 5. 注意事项
    • 集成 IP2Region 实现离线 IP 地址定位
    • 42集成 JSEncrypt 实现密码加密传输
    • 集成 HttpClient 实现 HTTP 接口增强
    • 集成 Druid 实现数据库密码加密功能
    • 集成 Browscap 实现用户代理解析
    • 集成 Dynamic-DataSource 实现多数据源增强
  • 若依框架
  • 集成插件
scholar
2024-08-31
目录

集成 Redisson 实现 Redis 分布式锁

# 集成 Redisson 实现 Redis 分布式锁

Redisson 是 Redis 官方推荐的 Java 客户端之一,提供了强大的分布式锁功能。通过集成 Redisson,可以在分布式系统中方便地实现分布式锁,确保多节点之间的同步和数据一致性。以下是如何在若依项目中集成 Redisson 实现 Redis 分布式锁的详细步骤。

# 1. 引入 Redisson 依赖

首先,在 ruoyi-common/pom.xml 文件中添加 Redisson 的 Maven 依赖:

<!-- Redisson 锁功能 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.2</version>
</dependency>
1
2
3
4
5
6

此依赖将自动为项目引入 Redisson,并提供与 Spring Boot 的集成支持。

# 2. 创建 RedisLock 工具类

为了便于在项目中使用 Redisson 实现分布式锁,我们可以创建一个 RedisLock 工具类,封装常用的锁操作。新建 RedisLock.java 文件,并添加以下内容:

package com.ruoyi.common.core.redis;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis 锁工具类
 * 
 * 提供了一些常用的分布式锁操作方法,如加锁、尝试加锁和解锁等。
 * 
 * @author ruoyi
 */
@Component
public class RedisLock {

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 获取锁实例
     * 
     * @param lockKey 锁实例的唯一标识
     * @return 锁实例
     */
    public RLock getRLock(String lockKey) {
        return redissonClient.getLock(lockKey);
    }

    /**
     * 加锁(阻塞式)
     * 
     * 调用此方法会阻塞当前线程,直到成功获取锁。
     * 
     * @param lockKey 锁实例的唯一标识
     * @return 锁实例
     */
    public RLock lock(String lockKey) {
        RLock lock = getRLock(lockKey);
        lock.lock();
        return lock;
    }

    /**
     * 尝试加锁
     * 
     * 此方法会尝试在指定时间内获取锁,如果超时则返回失败。
     * 
     * @param lockKey 锁实例的唯一标识
     * @param leaseTime 自动释放锁的时间
     * @return 是否成功加锁
     */
    public Boolean tryLock(String lockKey, long leaseTime) {
        return tryLock(lockKey, 0, leaseTime, TimeUnit.SECONDS);
    }

    /**
     * 尝试加锁
     * 
     * @param lockKey 锁实例的唯一标识
     * @param leaseTime 自动释放锁的时间
     * @param unit 时间单位
     * @return 是否成功加锁
     */
    public Boolean tryLock(String lockKey, long leaseTime, TimeUnit unit) {
        return tryLock(lockKey, 0, leaseTime, unit);
    }

    /**
     * 尝试加锁
     * 
     * @param lockKey 锁实例的唯一标识
     * @param waitTime 获取锁的最大等待时间
     * @param leaseTime 自动释放锁的时间
     * @param unit 时间单位
     * @return 是否成功加锁
     */
    public Boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) {
        RLock lock = getRLock(lockKey);
        try {
            return lock.tryLock(waitTime, leaseTime, unit);
        } catch (InterruptedException e) {
            return false;
        }
    }

    /**
     * 解锁
     * 
     * @param lockKey 锁实例的唯一标识
     */
    public void unlock(String lockKey) {
        RLock lock = getRLock(lockKey);
        lock.unlock();
    }

    /**
     * 解锁
     * 
     * @param lock 锁实例
     */
    public void unlock(RLock lock) {
        lock.unlock();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

# 3. 配置 RedissonConfig 类

为了使 Redisson 正确工作,我们需要配置 Redisson 客户端的初始化。新建 RedissonConfig.java 文件,并添加以下内容:

package com.ruoyi.framework.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Redisson 配置类
 * 
 * 初始化 RedissonClient,并根据应用配置 Redis 连接信息。
 * 
 * @author ruoyi
 */
@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private String port;

    @Value("${spring.redis.password}")
    private String password;

    @Bean(destroyMethod = "shutdown")
    @ConditionalOnMissingBean(RedissonClient.class)
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port);
        return Redisson.create(config);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

在这个配置类中,RedissonClient 将根据 application.yml 或 application.properties 中的 Redis 配置信息进行初始化。

# 4. 使用方式

在需要使用分布式锁的地方,可以通过注入 RedisLock 工具类来进行锁操作:

@Autowired
private RedisLock redisLock;

// 锁定资源
redisLock.lock("myLockKey");

// 尝试锁定资源,设置自动解锁时间
redisLock.tryLock("myLockKey", 10, TimeUnit.SECONDS);

// 解锁
redisLock.unlock("myLockKey");
1
2
3
4
5
6
7
8
9
10
11

# 5. 注意事项

  • 分布式锁的适用场景:分布式锁主要适用于多节点并发操作时需要确保数据一致性的场景,如分布式事务、库存扣减等操作。
  • 锁超时设置:建议在业务逻辑中合理设置锁的超时时间,以防止死锁的发生。
  • 锁的粒度:确保锁的粒度适当,避免因为锁范围过大而导致系统性能下降。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
集成 Knife4j 实现 Swagger 文档增强
集成 IP2Region 实现离线 IP 地址定位

← 集成 Knife4j 实现 Swagger 文档增强 集成 IP2Region 实现离线 IP 地址定位→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式