Spring Boot + Redis 实现分布式锁

在 Spring Boot 中结合 Redis 实现分布式锁,可以通过 RedissonJedis 等客户端来操作 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.propertiesapplication.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 项目中轻松地实现分布式锁,避免多个实例间的数据冲突。

相关推荐
Zane19946 分钟前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
用户69371750013847 分钟前
#DeepSeek+Pi‑Agent 王炸组合跑赢 Claude‑Code!
前端·人工智能·后端
Zane199411 分钟前
类变量与实例变量:一个共享列表引发的线上事故
后端·python
Scene21630 分钟前
AgentScope 2.0:2. 快速上手 从零构建生产级智能体
后端
前端一课36 分钟前
用 TRAE Work 把项目踩坑经验沉淀成「团队可复用工程规范」,新人再也不重复掉坑
前端·后端
神奇小汤圆43 分钟前
一文吃透 Spring 框架:原理、实践与面试全解析
后端
站大爷IP1 小时前
Python 的切片把我坑惨了,原来 `[:]` 是浅拷贝,而 `copy.deepcopy` 才是我的救命稻草
后端
神奇小汤圆1 小时前
Java 万字长文:从零基础到高级应用的完整教程——把面向对象讲透
后端
云烟成雨TD1 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer
孓最求完美1 小时前
实战经验:JT808/JT809 车联网高并发服务端性能优化指南
后端