
spring boot集成Redission框架
spring boot 集成Redission
spring boot集成Redission框架
背景
项目是基于spring cloud alibaba 框架,需要集成Redission框架,因此参照网上一些资料进行搭建,分享一下整个心路历程及参考资料,希望有所帮助
1、首先在pom文件中添加依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.6</version>
</dependency>
注意:引入次依赖后,无需再引入spring-boot-starter-data-redis
,其redisson-spring-boot-starter
内部已经进行了引入,且排除了Redis的Luttuce 以及 Jedis客户端,再配置两个客户端的配置是不会生效的
2、此时启动网关服务(pom中引入了common模块),启动失败报错信息:
Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type ‘org.springframework.http.codec.ServerCodecConfigurer’ that could not be found.
造成的原因:因为版本jar依赖冲突导致该问题的产生。
查看redisson-spring-boot-starter依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<scope>test</scope>
</dependency>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-24</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
可以发现它里面其实包含了spring-boot-starter-web和spring-boot-starter-actuator等依赖,而这两个依赖在网关服务的pom文件中也存在,所以冲突了,因此引入依赖部分排除掉这两个包
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.6</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
重新导入包,编译启动成功
3、添加Redission配置文件
spring:
redis:
host: 127.0.0.1
port: 6379
password:
enabled: true
database: 8
redisson:
# 单节点配置
singleServerConfig:
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 连接超时,单位:毫秒
connectTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 命令失败重试次数,如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。
# 如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
retryAttempts: 3
# 命令重试发送时间间隔,单位:毫秒
retryInterval: 1500
# 密码
password:
# 客户端名称
clientName: null
# 单个连接最大订阅数量
subscriptionsPerConnection: 5
# 节点地址
address: redis://127.0.0.1:6379
# 发布和订阅连接的最小空闲连接数
subscriptionConnectionMinimumIdleSize: 1
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小
connectionPoolSize: 64
# 数据库编号
database: 8
# DNS监测时间间隔,单位:毫秒
dnsMonitoringInterval: 5000
# 传输模式
transportMode: "NIO"
启动报错
Caused by: org.redisson.client.RedisException: ERR Client sent AUTH, but no password is set. channel: [id: 0xc046283b, L:/127.0.0.1:50504 - R:/127.0.0.1:6379] command: (AUTH), params: (password masked)
原因是对应redis服务器并没有配置密码,这里就必须把password删除,这与单独集成redis有区别,集成redis的时候可以写password:
修改后正常启动。
4、为业务服务配置Redission
(1) 单节点配置
application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
enabled: true
database: 0
redisson:
file: classpath:redisson-singleServerConfig.yml
redisson-singleServerConfig.yml
# 单节点配置
singleServerConfig:
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 连接超时,单位:毫秒
connectTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 命令失败重试次数,如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。
# 如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
retryAttempts: 3
# 命令重试发送时间间隔,单位:毫秒
retryInterval: 1500
# # 密码 如果为空,必须将该行注释掉
# password: ${REDIS_PASSWORD:}
# 客户端名称
clientName: null
# 单个连接最大订阅数量
subscriptionsPerConnection: 5
# 节点地址
address: redis://127.0.0.1:6379
# 发布和订阅连接的最小空闲连接数
subscriptionConnectionMinimumIdleSize: 1
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小
connectionPoolSize: 64
# 数据库编号
database: 0
# DNS监测时间间隔,单位:毫秒
dnsMonitoringInterval: 5000
# 线程池数量,默认值: 当前处理核数量 * 2
#threads: 0
# Netty线程池数量,默认值: 当前处理核数量 * 2
#nettyThreads: 0
# 编码
codec: !<org.redisson.codec.JsonJacksonCodec> {}
# 传输模式
transportMode: "NIO"
测试部分代码
..
public class RedissionTestController {
@Autowired
private RedissonClient redissonClient;
@Test
public void test() throws Exception{
RLock lock = redissonClient.getLock("anyLock");
new Thread(() -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + ":\t 获得锁");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + ":\t 释放锁");
// 锁被持有
if (lock != null && lock.isLocked()) {
if (lock.isHeldByCurrentThread()) {
// 解锁
lock.unlock();
}
}
}
}).start();
new Thread(() -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + ":\t 获得锁");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() + ":\t 释放锁");
// 锁被持有
if (lock != null && lock.isLocked()) {
if (lock.isHeldByCurrentThread()) {
// 解锁
lock.unlock();
}
}
}
}).start();
Thread.sleep(10000);
}
}
(2)哨兵模式
spring:
redis:
enabled: true
database: 0
sentinel:
master: master
nodes: XXX:7003,XXX:7004,XXX:7005
password: hxsoft
redisson:
file: classpath:redisson-sentinelServersConfig.yml
redisson-sentinelServersConfig.yml
sentinelServersConfig:
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 连接超时,单位:毫秒
connectTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 命令失败重试次数,如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。
# 如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
retryAttempts: 3
# 命令重试发送时间间隔,单位:毫秒
retryInterval: 1500
# 命令重试发送时间间隔,单位:毫秒
failedSlaveReconnectionInterval: 3000
# 命令重试发送时间间隔,单位:毫秒
failedSlaveCheckInterval: 60000
password: hxsoft
# 单个连接最大订阅数量
subscriptionsPerConnection: 5
clientName: null
# 在使用多个Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点:
# org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法
# org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法
# org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法
# 默认:RoundRobinLoadBalancer
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
# 用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。
# 长期保持一定数量的发布订阅连接是必须的。默认1
subscriptionConnectionMinimumIdleSize: 1
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
# 最小空闲连接数
slaveConnectionMinimumIdleSize: 24
# 多从节点的环境里,每个从服务节点里用于普通操作-非发布和订阅-连接的连接池最大容量。连接池的连接数量自动弹性伸缩。默认64
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 24
# 连接池大小
masterConnectionPoolSize: 64
# 设置读取操作选择节点的模式。 可用值为:
# SLAVE - 只在从服务节点里读取。 默认
# MASTER - 只在主服务节点里读取。
# MASTER_SLAVE - 在主从服务节点里都可以读取。
readMode: "SLAVE"
# 设置订阅操作选择节点的模式。可用值为:
# SLAVE - 只在从服务节点里订阅。默认
# MASTER - 只在主服务节点里订阅。
subscriptionMode: "SLAVE"
sentinelAddresses:
- "redis://XXX:7003"
- "redis://XXX:7004"
- "redis://XXX:7005"
masterName: "master"
database: 0
# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。默认当前处理核数量 * 2
threads: 8
# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
nettyThreads: 8
# Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
启动后会抛出:
org.redisson.client.RedisTimeoutException: Command execution timeout for command: (SENTINEL SENTINELS), params: [master], Redis client: [addr=redis://XXX:7004]
但仍然可以启动使用。查询原因:
基于maven的pom依赖,哨兵模式在redisson一些版本有问题(网上说是版本>=3.12.5和<3.15.0,但我试到3.15.6才不报错),项目启动的时候会报错Command execution timeout for command: (SENTINEL SENTINELS) :
修改版本号后项目启动正常,不再出现错误。
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.15.6</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
项目中用的springboot版本号2.3.X
(3)集群模式
---
# 集群模式
clusterServersConfig:
# 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,
# 那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。默认10000
idleConnectionTimeout: 1000
# 同节点建立连接时的等待超时。时间单位是毫秒。默认10000
connectTimeout: 1000
# 等待节点回复命令的时间。该时间从命令发送成功时开始计时。默认3000
timeout: 1000
# 命令失败重试次数,如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。
# 如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。
retryAttempts: 3
# 在一条命令发送失败以后,等待重试发送的时间间隔。时间单位是毫秒。默认1500
retryInterval: 1500
# 失败从节点重连间隔时间
failedSlaveReconnectionInterval: 3000
# 失败从节点校验间隔时间
failedSlaveCheckInterval: 60000
# 用于节点身份验证的密码。默认null
password: null
# 每个连接的最大订阅数量。默认5
subscriptionsPerConnection: 5
# 在Redis节点里显示的客户端名称。默认null
clientName: lizz
# 在使用多个Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点:
# org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法
# org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法
# org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法
# 默认:RoundRobinLoadBalancer
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
# 用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。
# 长期保持一定数量的发布订阅连接是必须的。默认1
subscriptionConnectionMinimumIdleSize: 1
# 多从节点的环境里,每个从服务节点里用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。默认50
subscriptionConnectionPoolSize: 50
# 多从节点的环境里,每个从服务节点里用于普通操作(非 发布和订阅)的最小保持连接数(长连接)。
# 长期保持一定数量的连接有利于提高瞬时读取反映速度。默认32
slaveConnectionMinimumIdleSize: 32
# 多从节点的环境里,每个从服务节点里用于普通操作(非 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。默认64
slaveConnectionPoolSize: 64
# 多从节点的环境里,每个主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。默认32
masterConnectionMinimumIdleSize: 32
# 多主节点的环境里,每个主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。 默认64
masterConnectionPoolSize: 64
# 设置读取操作选择节点的模式。 可用值为:
# SLAVE - 只在从服务节点里读取。 默认
# MASTER - 只在主服务节点里读取。
# MASTER_SLAVE - 在主从服务节点里都可以读取。
readMode: "SLAVE"
# 设置订阅操作选择节点的模式。可用值为:
# SLAVE - 只在从服务节点里订阅。默认
# MASTER - 只在主服务节点里订阅。
subscriptionMode: "SLAVE"
# 集群节点地址
nodeAddresses:
- "redis://XXX:6379"
- "redis://XXX:6380"
- "redis://XXX:6381"
- "redis://XXX:6382"
# 对主节点变化节点状态扫描的时间间隔。单位是毫秒。
scanInterval: 1000
# ping连接间隔
pingConnectionInterval: 0
# 是否保持连接
keepAlive: false
#
tcpNoDelay: false
# 这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。默认当前处理核数量 * 2
threads: 8
# 这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。
nettyThreads: 8
# Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。
# Redisson提供了多种的对象编码应用,以供大家选择:https://github.com/redisson/redisson/wiki/4.-data-serialization
# 默认 org.redisson.codec.MarshallingCodec,部分编码需要引入编码对于依赖jar包。
codec: !<org.redisson.codec.MarshallingCodec> {}
# 传输模式,默认NIO,可选参数:
# TransportMode.NIO,
# TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包(Linux)
# TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包(macOS)
transportMode: "NIO"
参考链接:
https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter
https://github.com/redisson/redisson/wiki/4.-data-serialization
https://blog.csdn.net/s_156/article/details/130847610
https://blog.csdn.net/leilei1366615/article/details/123885990
https://blog.csdn.net/yyongsheng/article/details/133761433
https://blog.csdn.net/xuexijava85/article/details/102462923
https://blog.csdn.net/StriverFeng/article/details/122695292
更多推荐
所有评论(0)