Spring Boot 3 整合 Redisson 实现分布式锁

Spring Boot 3 整合 Redisson 实现分布式锁

这篇博客详细介绍了如何在 Spring Boot 3 项目中使用 Redisson 实现分布式锁,包括依赖引入、Redis 配置、Redisson 配置、实现锁服务,以及测试控制器。希望对你有帮助!

介绍

在分布式系统中,多个服务实例可能会同时访问共享资源,导致数据不一致或竞争条件。使用分布式锁可以有效地解决这些问题。本文将介绍如何在 Spring Boot 3 项目中整合 Redisson 以实现分布式锁。

前提条件

  • Java Development Kit (JDK) 17 或更高版本
  • Maven 构建工具
  • Redis 服务器

引入依赖

首先,在你的 pom.xml 文件中引入 Redisson 的依赖:

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

配置 Redis

application.yml 文件中配置 Redis 的连接信息:

spring:
  data:
    redis:
      database: 0
      host: 127.0.0.1
      port: 6379
      password: 123456  # 如果没有密码,可以去掉这一行 去掉这一行

创建 RedisLockService 类

创建一个 RedisLockService 类来管理分布式锁的获取和释放:

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

import java.util.concurrent.TimeUnit;

@Service
public class RedisLockService {

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 获取锁的方法
     * @param lockKey 锁键
     * @param waitTime 等待时间
     * @param leaseTime 租约时间
     * @return 是否获取到锁
     */
    public boolean acquireLock(String lockKey, long waitTime, long leaseTime) {
        // 获取指定锁键对应的 Redisson 锁
        RLock lock = redissonClient.getLock(lockKey);
        try {
            // 尝试以指定等待时间和租约时间获取锁
            return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            // 当前线程中断
            Thread.currentThread().interrupt();
            // 返回获取锁失败
            return false;
        }
    }

    /**
     * 释放锁的方法
     * @param lockKey 锁键
     */
    public void releaseLock(String lockKey) {
        // 获取指定锁键对应的 Redisson 锁
        RLock lock = redissonClient.getLock(lockKey);
        // 如果当前线程持有该锁
        if (lock.isHeldByCurrentThread()) {
            // 释放锁
            lock.unlock();
        }
    }
 
}

创建控制器

创建一个控制器来测试分布式锁的功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LockController {

    @Autowired
    private RedisLockService redisLockService;

    @GetMapping("/doSomething")
    public String doSomething() {
        String lockKey = "myLock";
        boolean isLockAcquired = redisLockService.acquireLock(lockKey, 5, 10);

        if (isLockAcquired) {
            try {
                System.out.println("获取到锁!");

                // 在这里执行你的业务逻辑
                Thread.sleep(5000); // 模拟业务处理时间

                return "业务处理完成";
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return "业务处理失败";
            } finally {
                redisLockService.releaseLock(lockKey);
                System.out.println("锁已释放!");
            }
        } else {
            System.out.println("未能获取到锁!");
            return "业务处理失败";
        }
    }
}

运行应用

启动 Spring Boot 应用程序并访问 http://localhost:8080/doSomething,你应该会看到获取和释放锁的相关日志输出。

结论

通过上述步骤,我们成功地在 Spring Boot 3 项目中整合了 Redisson,实现了分布式锁的功能。Redisson 提供了强大且易于使用的 API,使得在分布式环境下实现锁机制变得简单且高效。

希望这篇文章对你有所帮助!如有任何问题或建议,欢迎讨论!

相关推荐

  1. Spring Boot 3 整合 Redisson 实现分布式

    2024-06-14 20:46:03       33 阅读
  2. SpringBoot+Redisson分布式

    2024-06-14 20:46:03       45 阅读
  3. SpringBoot+Redisson分布式

    2024-06-14 20:46:03       61 阅读
  4. Redisson 实现分布式

    2024-06-14 20:46:03       49 阅读
  5. Redisson实现分布式

    2024-06-14 20:46:03       30 阅读
  6. Spring Boot 中整合 Redisson 实现分布式

    2024-06-14 20:46:03       37 阅读
  7. redisson分布式实现方式

    2024-06-14 20:46:03       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 20:46:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 20:46:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 20:46:03       82 阅读
  4. Python语言-面向对象

    2024-06-14 20:46:03       91 阅读

热门阅读

  1. gitlab克隆本地切换p分支

    2024-06-14 20:46:03       26 阅读
  2. Webrtc支持FFMPEG硬解码之Intel(一)

    2024-06-14 20:46:03       25 阅读
  3. 前端开发中的热更新原理

    2024-06-14 20:46:03       31 阅读
  4. Linux/Ubuntu/Debian常用服务管理命令

    2024-06-14 20:46:03       26 阅读
  5. 【Spring Boot实现网页会话(Session )】

    2024-06-14 20:46:03       30 阅读
  6. 嵌入式Linux:格式化I/O

    2024-06-14 20:46:03       35 阅读
  7. llama factory 大数据量下训练失败

    2024-06-14 20:46:03       43 阅读
  8. 【AI原理解析】— Meta Llama-3模型

    2024-06-14 20:46:03       41 阅读
  9. 个人 PCB 设计规范

    2024-06-14 20:46:03       27 阅读
  10. SQLServer按照年龄段进行分组查询数据

    2024-06-14 20:46:03       33 阅读
  11. RAID分析及举例

    2024-06-14 20:46:03       38 阅读
  12. Spring boot开启跨域配置

    2024-06-14 20:46:03       32 阅读
  13. 创建型-单例模式(Singleton)

    2024-06-14 20:46:03       33 阅读
  14. [HGAME 2022 week3]Multi Prime RSA(欧拉函数)

    2024-06-14 20:46:03       29 阅读
  15. redis清空list

    2024-06-14 20:46:03       34 阅读