JedisPool连接redis出现NOAUTH Authentication required 异常的解决方法

本文介绍了一种在使用JedisPool连接Redis时遇到NOAUTH异常的情况,并提供了详细的解决方案。异常原因是未正确设置Redis连接密码,通过修改配置文件并正确传递密码参数解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中使用JedisPool连接redis出现NOAUTH Authentication required 的异常:

[2021-07-18 01:53:34] [http-nio-80-exec-9] ERROR jedis.JedisFactory:216: Error while validating pooled Jedis object.
 redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.
	at redis.clients.jedis.Protocol.processError(Protocol.java:135) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.Protocol.process(Protocol.java:169) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.Protocol.read(Protocol.java:223) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:352) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:270) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:381) ~[jedis-3.6.1.jar:?]
	at redis.clients.jedis.JedisFactory.validateObject(JedisFactory.java:214) [jedis-3.6.1.jar:?]
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:479) [commons-pool2-2.9.0.jar:2.9.0]
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:356) [commons-pool2-2.9.0.jar:2.9.0]
	at redis.clients.jedis.util.Pool.getResource(Pool.java:75) [jedis-3.6.1.jar:?]
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:366) [jedis-3.6.1.jar:?]
	at ltd.qiuhonghao.justice.league.shopping.controller.TestController.getMessage(TestController.java:66) [classes/:?]
    ....

出现异常的代码:

@GetMapping("/redis")
    public String getMessage(){
        log.info(jedisPoolConfig.toString());
        log.info(jedisPool.toString());
        // 在try的括号种进行创建资源连接,会在try语句结束后自动释放,前提是这些可关闭的资源必须实现 java.lang.AutoCloseable 接口。
        try (Jedis jedis = jedisPool.getResource()){
            coffeeService.getAllCoffee().forEach(c ->{
                jedis.hset("springbucks-menu",c.getName(),Long.toString(c.getPrice().getAmountMinorLong()));
            });

            Map<String, String> menu = jedis.hgetAll("springbucks-menu");
            log.info("Menu:{}",menu);

            String price = jedis.hget("springbucks-menu", "espresso");
            log.info("espresso - {}", Money.ofMinor(CurrencyUnit.of("CNY"), Long.parseLong(price)));
        }

        return jedisPool.toString();
    }

原因: 根据报错信息提示,是需要进行权限的验证。而联想到redis设置了密码,极有可能是没有Jedis连接池没有设置密码导致的。看了一下配置类,new JedisPool(jedisPoolConfig(),host) 这里根本没有设置密码:

@Slf4j
@Configuration
public class JedisConfiguration {

    @Bean
    @ConfigurationProperties(value = "diy.redis")
    public JedisPoolConfig jedisPoolConfig(){
        return new JedisPoolConfig();
    }

    @Bean(destroyMethod = "close")
    public JedisPool jedisPool(@Value("${diy.redis.host}") String host){
        return new JedisPool(jedisPoolConfig(),host);
    }

}

解决:

在application.properties 配置好参数,构造JedisPool 的时候传参即可。

@Slf4j
@Configuration
public class JedisConfiguration {

    @Value("${diy.redis.password}")
    private String password;
    
    @Bean
    @ConfigurationProperties(value = "diy.redis")
    public JedisPoolConfig jedisPoolConfig(){
        return new JedisPoolConfig();
    }

    @Bean(destroyMethod = "close")
    public JedisPool jedisPool(@Value("${diy.redis.host}") String host){
        return new JedisPool(jedisPoolConfig(),host,6379,2000,password);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值