在集群连接中通过 jedis 连接 redis 时面临问题,该连接用于存储 OAuth2 生成的令牌

问题描述 投票:0回答:0

我是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);
}

如果我的配置有任何错误,请告诉我。如果我需要更新任何版本的依赖项,也请告诉我。

spring-security oauth-2.0 spring-data-redis jedis redis-cluster
© www.soinside.com 2019 - 2024. All rights reserved.