【Redis】Spring Boot应用中的Redis分布式锁示例

发布于:2024-04-24 ⋅ 阅读:(25) ⋅ 点赞:(0)

前言

        Spring Boot应用中,使用Redisson框架实现一个分布式锁的详细示例,其中获取锁超时时间为30秒,锁失效时间为20秒。

引入依赖

        首先,确保你的Spring Boot应用中包含了Redisson的依赖,你可以在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.17.1</version> <!-- 此版本仅作示例,请使用最新版本 -->
</dependency>

然后,你可以在Spring Boot应用的配置文件(如application.properties)中配置Redis连接信息:

# Redisson配置
spring.redis.host=localhost
spring.redis.port=6379

接下来,你可以在需要使用分布式锁的地方注入RedissonClient并使用它来获取锁:

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;

@Component
public class DistributedLockExample {

    @Autowired
    private RedissonClient redissonClient;

    public void doSomethingWithLock() {
        String lockKey = "example_lock_key";
        RLock lock = redissonClient.getLock(lockKey);

        try {
            // 尝试获取锁,最多等待30秒,锁的失效时间为20秒
            boolean locked = lock.tryLock(30, 20, TimeUnit.SECONDS);
            if (locked) {
                // 获取锁成功后执行需要加锁的代码块
                System.out.println("成功获取到锁,开始执行任务...");
                // 模拟执行任务
                Thread.sleep(10000);
                System.out.println("任务执行完成!");
            } else {
                // 获取锁失败,处理失败逻辑
                System.out.println("获取锁失败!");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            // 处理线程中断异常
        } finally {
            // 释放锁
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println("释放锁!");
            }
        }
    }
}

        在这个示例中,我们注入了RedissonClient并使用它创建了一个分布式锁对象RLock。然后,我们使用tryLock方法尝试获取锁,设置了获取锁的超时时间为30秒,锁的失效时间为20秒。获取锁成功后,我们执行需要加锁的任务。最后,无论任务是否执行完成,都要释放锁