Spring Boot + Redis 实现分布式锁

在 Spring Boot 中结合 Redis 实现分布式锁,可以通过 Redisson 或 Jedis 等客户端来操作 Redis,从而实现分布式锁。以下是使用 Redisson 实现分布式锁的示例。

1. 添加依赖

在 pom.xml 中添加 Redisson 依赖:
登录后复制

plain 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.5</version>
</dependency>

2. 配置 Redis

在 application.properties 或 application.yml 中配置 Redis 连接:

application.properties 示例:

登录后复制

plain 复制代码
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your-password
spring.redis.timeout=2000
application.yml 示例:

登录后复制

plain 复制代码
spring:
  redis:
    host: localhost
    port: 6379
    password: your-password
    timeout: 2000

3. 使用 Redisson 实现分布式锁

创建服务类:

登录后复制

plain 复制代码
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;

    public void lockMethod() {
        // 获取分布式锁
        RLock lock = redissonClient.getLock("myLock");

        try {
            // 尝试加锁,等待时间 10 秒,锁定时间 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                // 执行需要加锁的业务代码
                System.out.println("Lock acquired, executing critical section");
                // 模拟执行业务操作
                Thread.sleep(10000);
            } else {
                System.out.println("Could not acquire lock, try again later");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }
}

4. 在 Controller 中调用服务

登录后复制

plain 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisLockController {

    @Autowired
    private RedisLockService redisLockService;

    @GetMapping("/test-lock")
    public String testLock() {
        redisLockService.lockMethod();
        return "Lock process completed.";
    }
}

5. 启动项目并测试

启动 Spring Boot 项目后,访问 http://localhost:8080/test-lock,你将看到分布式锁成功应用到方法中的效果。

关键点解释

  • redissonClient.getLock("myLock"):获取一个名为 "myLock" 的锁。
  • tryLock(10, 30, TimeUnit.SECONDS):尝试加锁,最多等待 10 秒,加锁后锁定 30 秒。如果无法获取锁,则会返回 false。
  • lock.unlock():在业务代码执行完成后,手动释放锁。

注意事项

  1. 锁的粒度:需要确保锁的粒度适合业务场景,避免过度加锁导致性能问题。
  2. 锁的超时:在分布式环境下,为避免死锁,应该设置锁的过期时间,即使业务没有完成也会自动释放锁。
  3. Redis的高可用性:如果 Redis 服务出现故障,锁也会失效,因此需要考虑 Redis 集群或哨兵机制来保证高可用。

通过这种方式,你可以在 Spring Boot 项目中轻松地实现分布式锁,避免多个实例间的数据冲突。

相关推荐
Wang's Blog3 小时前
Java 中间件之 RabbitMQ 快速入门: SpringAMQP WorkQueue 工作队列模型
java·中间件·java-rabbitmq
今年下半年3 小时前
【低成本埋点统计】Spring Boot+vue2前后端分离项目统计系统访问、使用、登录次数
spring boot·后端·状态模式
代码山河3 小时前
第一个Java程序:Hello World从零编写与运行
java·学习·架构·教程·面向对象·项目
codigger3 小时前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
java·后端·编程·编程语言
高级程序源3 小时前
springboot荆州旅游推介平台24175-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·django·课程设计
盖世英雄酱581363 小时前
格式化成日期为什么提前一天呢,同样的时间点还是非必现???
java·后端
威哥爱编程3 小时前
【AI全栈12-05】Spring Boot 用 Tool Calling 让 AI 查实时订单与库存
java·spring boot·后端
Guarding and trust3 小时前
项目拆解(二):模型输出是‘野‘的——三层兜底+重分析,把AI变成可靠零件
java·人工智能·python·大模型·fastapi·ollama·错误兜底
用户298698530143 小时前
Python 实战:将 HTML 内容保存为图像文件
后端·python·html
春风霓裳4 小时前
0xc0000005 = 内存访问违规
java