项目场景:

在单机情况下,用synchronized和ReentrantLock保证业务的原子性是没有任何问题的,但是将我们的项目采用分布式部署的话,这种单机锁是完全没有用的所以我们引入了 redisson 实现分布式锁


RedissonClient创建连接配置:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public Redisson redisson() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://192.168.17.129:6379");
        return (Redisson) Redisson.create(config);
    }
}

业务代码实现redission:

public class SekillController {

    public static final String REDIS_LOCK = "redis_lock";
    @Autowired
    private Redisson redisson;

    @GetMapping("/testRedisson")
    public String testRedisson() {
        RLock redissonLock = redisson.getLock(REDIS_LOCK);
        try {
            //todo 008 引入 redission实现分布式锁
            redissonLock.lock();
			//doString()   业务代码实现
        } finally {
            redissonLock.unlock();
        }
        return "";
    }

}

问题描述:

在spring boot中加入redisson创建客户端对象后,成功运行,但是在对接口访问时,报错:
org.redisson.client.RedisAuthRequiredException: NOAUTH Authentication required…
在这里插入图片描述


原因分析:

初看可知是未取得redis的授权导致的错误,再百度后可得的确是在redis进行密码验证后就可正常访问。


解决方案:

为redis连接设置密码。

对代码语句进行排错:
在这里插入图片描述
修改后
在这里插入图片描述

验证,又出了个新的小弟:

成功运行,但是在对接口访问时,又出现新的错误,喵了个咪,报错信息:
org.redisson.client.RedisException: ERR Error running script (call to f_dad0f8d619e548e04f21fb48d50be5034df3adae): @user_script:1: WRONGTYPE Operation against a key holding the wrong kind of value.


再分析:

WRONGTYPE Operation against a key holding the wrong kind of value.**
针对持有错误类型值的键的错误类型操作。
他这里也就是说我们要加的这把redis锁的 key有问题,我就喵了个咪的了我,我们去看一眼,我到底写了个何方神圣。

我这里也去查了其他帖子说, org.redisson.client.RedisException: ERR Error running script (
一般这个错误就是你设置的key 可能夹带 中文格式的私活想蒙混过关的那种,比如:中文的逗号,或者下划线之类的。
在这里插入图片描述


再排错:

**看看我设置了个何方神圣
对代码语句进行排错: 阿Sir,冤枉呀,我真的没有夹带私货呀
在这里插入图片描述
既然阿Sir说他有问题,那我们也没办法,凭着试一下的心态,要不咱先验个尿?换他一波? 干他
将key换成任意一个不带redis字样的。 比如: MONEY_BUGS_ROAD

修改后
在这里插入图片描述


再验证:

成功运行,访问接口,返回成功:
这年头看来还是money好使。
问题成功解决
在这里插入图片描述


总结:

1、用redisson实现 redis分布式锁,创建redisClent连接时 需要连接密码验证。当然我的项目是有设置了redis连接密码才出现的这个问题,我没有验证过如果不设置密码会不会出现这个问题那?欢迎哪位兄得跟我一起讨论下
2、设置redis 的Key 时尽量避免使用关键字设置,以免出现问题。当前其他的一些插件运用应该也是这个道理吧,就像 ”“java”“ 关键字 打出生就被放在 String常量池这个娘胎里一样吧。


最后感谢各位兄得的支持,希望我的这篇文章可以帮到你们,为你们节约宝贵的时间,如果本篇文章有什么错误的地方,我希望大佬能帮我指出来,好了解自己的不足,岁月静好,愿与诸位共同进步,谢谢大家。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐