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 项目中轻松地实现分布式锁,避免多个实例间的数据冲突。

相关推荐
愿你天黑有灯下雨有伞22 分钟前
告别复杂配置!Spring Boot优雅集成百度OCR的终极方案
spring boot·百度·ocr
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
码字的字节2 小时前
ZooKeeper在Hadoop中的协同应用:从NameNode选主到分布式锁实现
hadoop·分布式·zookeeper·分布式锁
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
舒一笑5 小时前
我的开源项目-PandaCoder迎来史诗级大更新啦
后端·程序员·intellij idea
@昵称不存在6 小时前
Flask input 和datalist结合
后端·python·flask
zhuyasen6 小时前
Go 分布式任务和定时任务太难?sasynq 让异步任务从未如此简单
后端·go
东林牧之7 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先