分布式锁的原理

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); // 确保释放锁
        }
    }
}
相关推荐
倔强青铜三10 分钟前
苦练Python第48天:类的私有变量“防身术”,把秘密藏进类里!
人工智能·python·面试
倔强青铜三11 分钟前
苦练Python第47天:一文吃透继承与多继承,MRO教你不再踩坑
人工智能·python·面试
倔强青铜三12 分钟前
为什么Python程序员必须学习Pydantic?从数据验证到API开发的革命性工具
人工智能·python·面试
华仔啊24 分钟前
王者段位排行榜如何实现?Redis有序集合实战
java·redis·后端
豌豆花下猫31 分钟前
Python 潮流周刊#120:新型 Python 类型检查器对比(摘要)
后端·python·ai
南方者1 小时前
当小学生的手写体也能识别出来,PP-OCRv5 稳了!
后端·图像识别
RoyLin2 小时前
TypeScript设计模式:解释器模式
前端·后端·typescript
易元3 小时前
模式组合应用-享元模式
后端·设计模式
对象存储与RustFS3 小时前
零基础小白手把手教程:用Docker和MinIO打造专属私有图床,并完美搭配PicGo
后端