分布式锁的原理

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); // 确保释放锁
        }
    }
}
相关推荐
野生技术架构师15 分钟前
Java面试题及答案总结(互联网大厂新版)
java·面试·状态模式
a努力。16 分钟前
小红书Java面试被问:ThreadLocal 内存泄漏问题及解决方案
java·jvm·后端·算法·面试·架构
测试老哥20 分钟前
2026软件测试面试大全(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
serendipity_hky21 分钟前
【go语言 | 第4篇】goroutine模型和调度策略
后端·性能优化·golang
xiaoxue..24 分钟前
LeetCode 第 15 题:三数之和
前端·javascript·算法·leetcode·面试
yaoh.wang27 分钟前
力扣(LeetCode) 28: 找出字符串中第一个匹配项的下标 - 解法思
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
yaoh.wang28 分钟前
力扣(LeetCode) 35: 搜索插入位置 - 解法思路
程序人生·算法·leetcode·面试·职场和发展·跳槽·二分搜索
狂炫冰美式30 分钟前
《预言市场进化论:从罗马斗兽场,到 Polymarket 的 K 线图》
前端·后端
hahjee1 小时前
Go编写的ANSI终端颜色和样式控制库在OpenHarmony PC上的完整适配实战
开发语言·后端·鸿蒙
小火锅啊1 小时前
java实现生成PDF文件
后端