spring-data-redis - RedisSentinelConfiguration 使用 spring.redis.sentinel.nodes 和 spring boot
问题描述
尝试使用 spring-session 和 redis 配置 Spring Boot 应用程序,但遇到以下问题。无法解决它。
构造函数抛出异常;嵌套异常是 java.lang.IllegalStateException: BeanFactory 尚未注入 @Configuration 类
这段代码对我来说很好
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(SLAVE_PREFERRED)
.build();
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("192.168.56.50", 26379)
.sentinel("192.168.56.50", 26380)
.sentinel("192.168.56.50", 26381);
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(sentinelConfig, clientConfig);
}
}
但不是此代码使用 PropertySource。
Spring 文档说:- **RedisSentinelConfiguration 也可以使用 PropertySource 定义,它允许您设置以下属性:
配置属性 spring.redis.sentinel.master:主节点的名称。
spring.redis.sentinel.nodes:逗号分隔的主机:端口对列表。**
@Configuration
@EnableRedisHttpSession
@PropertySource(name="application", value="classpath:application.properties")
public class HttpSessionConfig {
@Resource
ConfigurableEnvironment environment;
@Bean
public PropertiesPropertySource propertySource() {
return (PropertiesPropertySource) environment.getPropertySources().get("defaultProperties");
}
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(SLAVE_PREFERRED)
.build();
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(propertySource());
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(sentinelConfig, clientConfig);
}
}
应用程序属性
server.port=8090
spring.security.user.name=admin
spring.security.user.password=admin
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.56.50:26379,192.168.56.50:26380,192.168.56.50:26381
spring.application.name=spring-session-demo
解决方案
哨兵节点属性的格式是逗号分隔的键:值对。split()
所以你可以通过java函数提取主机和端口。
@Autowired
private Environment env;
@Bean
public LettuceConnectionFactory connectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration();
String master = env.getProperty("spring.redis.sentinel.master");
String nodes = env.getProperty("spring.redis.sentinel.nodes");
sentinelConfig.master(master);
for (String node : nodes.split(",")) {
String split[] = node.split(":");
sentinelConfig.sentinel(split[0], Integer.parseInt(split[1]));
}
...
}
推荐阅读
- javascript - OpenLayers - 编辑功能(隐藏/显示,更改图标)
- elasticsearch - 在弹性搜索中将子项添加到父文档的嵌套字段中
- c++ - NE10库中FFT函数的输入范围是多少
- ios - 有没有办法为工业增强现实构建 iOS 应用程序?
- ios - 如何为 RadDataForm ListPicker 的选择器设置样式
- c# - 数组是否实现了 IEnumerable
? - flutter - 我的 AppBar 在屏幕上的图像后面,或者我看不到它,有什么建议可以在顶部显示我的 AppBar 和 buttonNavigator 并且是半透明的吗?
- google-sheets - 如何使用条件格式在 Google 表格的 1 列中突出显示部分匹配的重复项
- html - 在有两个标题的表格中,主标题不会在滚动时保持粘性
- python - 如何改变盒子的不透明度(cv2.rectangle)?