
springboot 使用 redisson 分布式锁
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.18</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.17.6</version>
</dependency>
官方的 redisson springboot 自动配置类(org.redisson.spring.starter.RedissonAutoConfiguration),读取的配置前缀是 spring.redis.redisson
看一下自动配置创建 redisson 实例的逻辑 org.redisson.spring.starter.RedissonAutoConfiguration#redisson
@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(RedissonClient.class)
public RedissonClient redisson() throws IOException {
Config config = null;
Method clusterMethod = ReflectionUtils.findMethod(RedisProperties.class, "getCluster");
Method timeoutMethod = ReflectionUtils.findMethod(RedisProperties.class, "getTimeout");
Object timeoutValue = ReflectionUtils.invokeMethod(timeoutMethod, redisProperties);
// 从 spring.redis 取超时配置值
int timeout;
if(null == timeoutValue){
timeout = 10000;
}else if (!(timeoutValue instanceof Integer)) {
Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis");
timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue();
} else {
timeout = (Integer)timeoutValue;
}
if (redissonProperties.getConfig() != null) {
// 填写了 spring.redis.redisson.config,则读取字符串直接加载
try {
config = Config.fromYAML(redissonProperties.getConfig());
} catch (IOException e) {
try {
config = Config.fromJSON(redissonProperties.getConfig());
} catch (IOException e1) {
throw new IllegalArgumentException("Can't parse config", e1);
}
}
} else if (redissonProperties.getFile() != null) {
// 填写了 spring.redis.redisson.file,则从配置文件中加载配置
...
...
} else if (redisProperties.getSentinel() != null) {
// 哨兵配置
...
...
} else if (clusterMethod != null && ReflectionUtils.invokeMethod(clusterMethod, redisProperties) != null) {
// 配置了集群配置项,则使用集群方式
...
...
} else {
// 没有额外配置 spring.redis.redisson.config / file,不是集群模式,也不是哨兵模式,则生成默认配置
config = new Config();
String prefix = REDIS_PROTOCOL_PREFIX;
Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl");
if (method != null && (Boolean)ReflectionUtils.invokeMethod(method, redisProperties)) {
prefix = REDISS_PROTOCOL_PREFIX;
}
// 使用单redis服务方式连接
// redis连接地址、database、密码从 spring.redis 中获取
config.useSingleServer()
.setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort())
.setConnectTimeout(timeout)
.setDatabase(redisProperties.getDatabase())
.setPassword(redisProperties.getPassword());
}
if (redissonAutoConfigurationCustomizers != null) {
for (RedissonAutoConfigurationCustomizer customizer : redissonAutoConfigurationCustomizers) {
customizer.customize(config);
}
}
return Redisson.create(config);
}
默认 redisson 是从 redis 取连接参数去创建,如果想单独设置 redisson 的连接参数,那么可以填写 spring.redis.redisson.config(字符串方式的配置) 或 spring.redis.redisson.file(指定配置文件路径)
对于 spring.redis.redisson.config 这个参数,它只接收字符串的值,所以在写 yaml 配置时,需要改成下面这种形式,| 表示多行字符串
这个例子是将 redisson 线程数改小
spring:
redis:
host: 127.0.0.1
port: 6379
# 密码(如没有密码请注释掉)
# password:
database: 5
timeout: 10s
ssl: false
# redisson 配置
redisson:
config: |
# 线程数量
threads: 4
# Netty线程数量
nettyThreads: 8
# 单服务配置
singleServerConfig:
connectTimeout: 10000
address: "redis://${spring.redis.host}:${spring.redis.port}"
database: ${spring.redis.database}
password: ${spring.redis.password:}
本文是原创文章,采用 CC 4.0 BY-SA 协议,完整转载请注明来自 KK元空间
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果