分布式锁的原理

redissonRedis官方推荐的分布式锁实现,其核心原理如下:

  1. 看门狗机制 :默认情况下,未指定leaseTime时,Redisson会启动看门狗线程自动续期锁(默认30秒续一次);
  2. 锁超时释放 :若指定leaseTime,锁将在固定时间后自动释放(不触发看门狗);
  3. 可重入 :同一线程可重复获取锁(锁计数器+1),需对应次数的解锁操作;
  4. 公平锁 :通过getFairLock()可创建公平锁,按请求顺序分配锁;

使用方式:

  1. 引入依赖
xml 复制代码
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.17.7</version> <!-- 使用最新版本 -->
</dependency>
  1. 配置类
arduino 复制代码
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonConfig {
    public static RedissonClient getClient() {
        Config config = new Config();
        config.useSingleServer()
              .setAddress("redis://127.0.0.1:6379")  // Redis地址
              .setPassword("your_password")          // 密码(可选)
              .setDatabase(0);                        // 数据库编号
        return Redisson.create(config);
    }
}
  1. 工具类
java 复制代码
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;

public class DistributedLockUtil {
    private static final RedissonClient redissonClient = RedissonConfig.getClient();

    // 获取锁
    public static RLock getLock(String lockKey) {
        return redissonClient.getLock(lockKey);
    }

    // 尝试加锁(推荐使用)
    public static boolean tryLock(RLock lock, long waitTime, long leaseTime, TimeUnit unit) {
        try {
            return lock.tryLock(waitTime, leaseTime, unit);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return false;
        }
    }

    // 释放锁
    public static void unlock(RLock lock) {
        if (lock != null && lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}
  1. 业务代码中的使用
java 复制代码
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;

public class OrderService {
    public void createOrder(String orderId) {
        RLock lock = DistributedLockUtil.getLock("LOCK_ORDER:" + orderId);
        try {
            // 尝试获取锁:最多等待2秒,锁持有时间30秒(自动续期由看门狗机制处理)
            boolean isLocked = DistributedLockUtil.tryLock(lock, 2, 30, TimeUnit.SECONDS);
            if (isLocked) {
                // 执行业务逻辑(如防止重复下单)
                System.out.println("执行业务操作...");
            } else {
                throw new RuntimeException("获取锁失败,请重试");
            }
        } finally {
            DistributedLockUtil.unlock(lock); // 确保释放锁
        }
    }
}
相关推荐
uzong10 小时前
Mermaid: AI 时代画图的魔法工具
后端·架构
q***697711 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
Warren9812 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
IUGEI12 小时前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#
间彧13 小时前
GraalVM Native Image:跨平台能力与编译模式深度解析
后端
间彧13 小时前
GraalVM Native Image 与传统 JVM 内存管理:云原生时代的技术选型指南
后端
r***123813 小时前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
b***748813 小时前
前端GraphQL案例
前端·后端·graphql
LSL666_13 小时前
SpringBoot自动配置类
java·spring boot·后端·自动配置类
q***783714 小时前
Spring Boot 3.X:Unable to connect to Redis错误记录
spring boot·redis·后端