增加 Redis 分布式锁

This commit is contained in:
YunaiV
2021-02-24 01:35:41 +08:00
parent 94dfe41153
commit 53db9de93d
13 changed files with 109 additions and 6 deletions

View File

@ -0,0 +1,23 @@
package cn.iocoder.dashboard.framework.lock4j.config;
import cn.hutool.core.util.ClassUtil;
import cn.iocoder.dashboard.framework.lock4j.core.DefaultLockFailureStrategy;
import cn.iocoder.dashboard.framework.lock4j.core.Lock4jRedisKeyConstants;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Lock4jConfiguration {
static {
// 手动加载 Lock4jRedisKeyConstants 类,因为它不会被使用到
// 如果不加载,会导致 Redis 监控,看到它的 Redis Key 枚举
ClassUtil.loadClass(Lock4jRedisKeyConstants.class.getName());
}
@Bean
public DefaultLockFailureStrategy lockFailureStrategy() {
return new DefaultLockFailureStrategy();
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.dashboard.framework.lock4j.core;
import cn.iocoder.dashboard.common.exception.ServiceException;
import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
import com.baomidou.lock.LockFailureStrategy;
import lombok.extern.slf4j.Slf4j;
/**
* 自定义获取锁失败策略,抛出 {@link cn.iocoder.dashboard.common.exception.ServiceException} 异常
*/
@Slf4j
public class DefaultLockFailureStrategy implements LockFailureStrategy {
@Override
public void onLockFailure(String key, long acquireTimeout, int acquireCount) {
log.debug("[onLockFailure][线程:{} 获取锁失败key:{} 获取超时时长:{} ms]", Thread.currentThread().getName(), key, acquireTimeout);
throw new ServiceException(GlobalErrorCodeConstants.CONCURRENCY_REQUESTS);
}
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.dashboard.framework.lock4j.core;
import cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine;
import org.redisson.api.RLock;
import static cn.iocoder.dashboard.framework.redis.core.RedisKeyDefine.KeyTypeEnum.HASH;
/**
* Lock4j Redis Key 枚举类
*
* @author 芋道源码
*/
public interface Lock4jRedisKeyConstants {
RedisKeyDefine LOCK4J = new RedisKeyDefine("分布式锁",
"lock4j:%s", // 参数来自 DefaultLockKeyBuilder 类
HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构
}

View File

@ -0,0 +1,4 @@
/**
* 分布式锁组件,使用 https://gitee.com/baomidou/lock4j 开源项目
*/
package cn.iocoder.dashboard.framework.lock4j;