123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package com.txz.mall.util;
- import lombok.extern.slf4j.Slf4j;
- import org.redisson.api.RLock;
- import org.redisson.api.RedissonClient;
- import org.springframework.stereotype.Component;
- import javax.annotation.PostConstruct;
- import javax.annotation.Resource;
- import java.util.concurrent.TimeUnit;
- @Slf4j
- @Component
- public class RedissonLockUtil {
- @Resource
- private RedissonClient redissonClient;
- private static RedissonLockUtil instance;
- private RedissonLockUtil() {}
- @PostConstruct
- public void init() {
- instance = this;
- }
- /**
- * 获取分布式锁(阻塞式,直到获取锁为止)
- * @param lockKey 锁的唯一标识
- * @return 锁对象
- */
- public static RLock getLock(String lockKey) {
- RLock lock = instance.redissonClient.getLock(lockKey);
- try {
- // 尝试获取锁,一直阻塞直到获取成功
- lock.lock();
- log.info("获取锁成功,lockKey: {}", lockKey);
- } catch (Exception e) {
- log.error("获取锁失败,lockKey: {}, 异常: {}", lockKey, e.getMessage());
- throw new RuntimeException("获取分布式锁失败", e);
- }
- return lock;
- }
- /**
- * 获取分布式锁(带超时,超过时间未获取则放弃)
- * @param lockKey 锁的唯一标识
- * @param waitTime 等待获取锁的最大时间(单位:秒)
- * @param leaseTime 锁的自动释放时间(单位:秒)
- * @return 是否获取到锁
- */
- public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
- RLock lock = instance.redissonClient.getLock(lockKey);
- try {
- // 尝试在 waitTime 秒内获取锁,若获取成功则保持 leaseTime 秒后自动释放
- boolean isLocked = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
- if (isLocked) {
- log.info("尝试获取锁成功,lockKey: {}", lockKey);
- } else {
- log.warn("尝试获取锁失败,lockKey: {}", lockKey);
- }
- return isLocked;
- } catch (InterruptedException e) {
- log.error("尝试获取锁被中断,lockKey: {}, 异常: {}", lockKey, e.getMessage());
- Thread.currentThread().interrupt();
- return false;
- } catch (Exception e) {
- log.error("尝试获取锁异常,lockKey: {}, 异常: {}", lockKey, e.getMessage());
- return false;
- }
- }
- /**
- * 释放分布式锁
- * @param lockKey 锁的唯一标识
- */
- public static void unlock(String lockKey) {
- RLock lock = instance.redissonClient.getLock(lockKey);
- try {
- if (lock.isLocked() && lock.isHeldByCurrentThread()) {
- lock.unlock();
- log.info("释放锁成功,lockKey: {}", lockKey);
- } else {
- log.warn("释放锁失败,锁未被当前线程持有或已释放,lockKey: {}", lockKey);
- }
- } catch (Exception e) {
- log.error("释放锁异常,lockKey: {}, 异常: {}", lockKey, e.getMessage());
- throw new RuntimeException("释放分布式锁失败", e);
- }
- }
- /**
- * 释放分布式锁(带锁对象,用于 tryLock 场景)
- * @param lock 锁对象
- */
- public static void unlock(RLock lock) {
- try {
- if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
- lock.unlock();
- log.info("释放锁成功,lockKey: {}", lock.getName());
- } else {
- log.warn("释放锁失败,锁未被当前线程持有或已释放,lockKey: {}", lock.getName());
- }
- } catch (Exception e) {
- log.error("释放锁异常,lockKey: {}, 异常: {}", lock.getName(), e.getMessage());
- throw new RuntimeException("释放分布式锁失败", e);
- }
- }
- // 关闭 Redisson 客户端(项目关闭时调用)
- public static void shutdown() {
- if (instance.redissonClient != null) {
- instance.redissonClient.shutdown();
- log.info("Redisson 客户端已关闭");
- }
- }
- }
|