我正在尝试使用 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密码的选项。
请帮忙解决这个问题。
我最初使用 spring-boot-starter-data-redis 依赖项来连接到 redis 哨兵。但它没有任何传递 SentinelPassword 的功能,因此 redis 会抛出 Authentication required 错误。
现在我将我的redis包更改为spring-data-redis,它具有传递sentinelPassword的功能,并且我能够成功连接。