我是redis集群的新手。集群模式下的 Redis 服务器对我来说工作正常。现在,我正在尝试使用 java spring 应用程序进行连接,其中使用 jedis 放置了 redis 集群连接,而且它将用于存储 OAuth2 生成的令牌。
到底发生了什么,我的应用程序构建成功,我也能够启动应用程序。一旦我尝试生成 OAuth2 访问令牌,它就会给我一些关于 jedis 管道问题的警告。
我的pom.xml文件如下:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
我的RedisConfiguration.java类如下:
@Configuration
public class RedisConfiguration {
@Value("LIST_OF_ALL_CLUSTERNODES")
private String clusterNodes;
@Value("27")
private int maxRedirects;
@SuppressWarnings("deprecation")
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
redisClusterConfiguration.setClusterNodes(getClusterNodes());
redisClusterConfiguration.setMaxRedirects(maxRedirects);
redisClusterConfiguration.setPassword(RedisPassword.of("PASSWORD"));
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setPoolConfig(buildPoolConfig());
jedisConnectionFactory.setUsePool(true);
return jedisConnectionFactory;
}
private JedisPoolConfig buildPoolConfig() {
final JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(40);
poolConfig.setMaxIdle(40);
poolConfig.setMinIdle(8);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
poolConfig.setNumTestsPerEvictionRun(3);
poolConfig.setBlockWhenExhausted(true);
return poolConfig;
}
private Iterable<RedisNode> getClusterNodes() {
String[] hostAndPorts = StringUtils.commaDelimitedListToStringArray(clusterNodes);
Set<RedisNode> clusterNodes = new HashSet<>();
for(String hostAndPort : hostAndPorts) {
int lastScIndex = hostAndPort.lastIndexOf(":");
if(lastScIndex == -1) continue;
try {
String host = hostAndPort.substring(0, lastScIndex);
Integer port = Integer.parseInt(hostAndPort.substring(lastScIndex+1));
clusterNodes.add(new RedisNode(host, port));
} catch(Exception e) {
e.printStackTrace();
}
}
return clusterNodes;
}
@Bean
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> template = new RedisTemplate<String, String>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
RedisConnectionFactory redisConnectionFactory = template.getConnectionFactory();
return template;
}
@Bean
public RedisMessageListenerContainer container(final JedisConnectionFactory connectionFactory,
final MessageListenerAdapter messageListenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(messageListenerAdapter, new PatternTopic("cloudBridge"));
return container;
}
@Bean
public MessageListenerAdapter listenerAdapter(final RedisMessageSubscriber importTargetListener) {
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(importTargetListener, "onMessage");
messageListenerAdapter.setSerializer(new KryoBoxer<>(RedisMessage.class));
return messageListenerAdapter;
}
@Bean
public RedisMessageSubscriber importTargetListener() {
return new RedisMessageSubscriber();
}
// For Sending Party Configuration Only
@Bean
public RedisTemplate<String, RedisMessage> importTargetCache(final JedisConnectionFactory connectionFactory) {
final RedisTemplate<String, RedisMessage> importTargetCache = new RedisTemplate<>();
importTargetCache.setConnectionFactory(connectionFactory);
importTargetCache.setDefaultSerializer(new KryoBoxer<>(RedisMessage.class));
return importTargetCache;
}
}
我的OAuth2令牌存储配置如下:
@Autowired
private JedisConnectionFactory jedisConnectionFactory;
@Bean
public TokenStore tokenStore() {
return new RedisTokenStore(jedisConnectionFactory);
}
如果我的配置有任何错误,请告诉我。如果我需要更新任何版本的依赖项,也请告诉我。