分布式锁的原理

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); // 确保释放锁
        }
    }
}
相关推荐
爱读源码的大都督19 分钟前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈20 分钟前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端
间彧20 分钟前
Spring Boot条件注解详解与项目实战
后端
im_AMBER37 分钟前
Web 开发 27
前端·javascript·笔记·后端·学习·web
间彧38 分钟前
ApplicationRunner与CommandLineRunner详解与应用实战
后端
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
计算机毕业设计木哥2 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
235162 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
聪明的笨猪猪2 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
苏打水com2 小时前
JavaScript 面试题标准答案模板(对应前文核心考点)
javascript·面试