在 JAVA Spring Boot 中无法通过 Lettuce 连接 Redis Sential

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

我正在尝试使用 Lettuce 在 JAVA Spring Boot 中连接 Redis Sentinel。但我收到错误NOAUTH 需要身份验证。

exception message :: Unable to connect to Redis; nested exception is io.lettuce.core.RedisException: java.util.concurrent.ExecutionException: io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.

但是我正确地传递了密码。当我使用独立的 redis 连接进行测试时,它正在工作。以下是独立连接的代码。

    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {

        RedisStandaloneConfiguration rs = new RedisStandaloneConfiguration("redis-host.svc.cluster.local", 6379);
        rs.setPassword(RedisPassword.of("original_password"));
        return new LettuceConnectionFactory(rs);
        
    }

    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .disableCachingNullValues();
        return RedisCacheManager.builder(lettuceConnectionFactory).cacheDefaults(redisCacheConfiguration).build();
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        final RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(lettuceConnectionFactory());
        return redisTemplate;
    }

下面是连接Redis Sentinel的代码

    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {

        String pwd = "original_password";
        
        RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration().master("master");                                                           
        sentinelConfiguration.sentinel("redis-host.svc.cluster.local", 26379);
        sentinelConfiguration.setPassword(RedisPassword.of(pwd));
        
        return new LettuceConnectionFactory(sentinelConfiguration);
        
    }

    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .disableCachingNullValues();
        return RedisCacheManager.builder(lettuceConnectionFactory).cacheDefaults(redisCacheConfiguration).build();
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        final RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(lettuceConnectionFactory());
        return redisTemplate;
    }

我可以使用 Node.js 正确连接相同的 redis 哨兵。下面是 Node.js 正确连接 Redis Sentinel 的代码。

const Redis = require('ioredis');
 
const redisClient = new Redis({
    sentinels: [
        {
            host: "redis-host.svc.cluster.local",
            port: 26379
        },
    ],
    password: 'original_password',
    sentinelPassword: 'original_password',
    name: 'master',
});
 
 
(async function() {
    await redisClient.set('key', 'value');
    const value = await redisClient.get('key');
    console.log(value);
})();

在node.js(io-redis)中,似乎我们必须同时传递password和sentinelPassword才能与Redis哨兵连接。排除其中任何一个都会导致我在 JAVA 中遇到的相同错误。

但是在java(luttece)中,我看不到任何设置密码的函数,它只有设置sentinelPassword密码的选项。

请帮忙解决这个问题。

java spring-boot redis redis-sentinel
2个回答

0
投票

我最初使用 spring-boot-starter-data-redis 依赖项来连接到 redis 哨兵。但它没有任何传递 SentinelPassword 的功能,因此 redis 会抛出 Authentication required 错误。

现在我将我的redis包更改为spring-data-redis,它具有传递sentinelPassword的功能,并且我能够成功连接。

© www.soinside.com 2019 - 2024. All rights reserved.