分布式锁的原理

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); // 确保释放锁
        }
    }
}
相关推荐
维克兜率天2 小时前
【维克】ARMA模型:AR与MA的完美结合
后端·restful
是未才3 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
上海安当技术3 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队4 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600445 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
IT_陈寒5 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635076 小时前
Type vs Interface:读完这篇就没有面试官能难倒你了
前端·面试·typescript
用户938515635076 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
windliang7 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
wei_shuo7 小时前
KES 云原生部署与弹性扩展:容器化、Kubernetes编排与自动伸缩
后端