引入redission实现分布式锁问题记录 ( NOAUTH Authentication required..*)* ( ERR Error running script)
项目场景:在单机情况下,用synchronized和ReentrantLock保证业务的原子性是没有任何问题的,但是将我们的项目采用分布式部署的话,这种单机锁是完全没有用的所以我们引入了 redisson 实现分布式锁RedissonClient创建连接配置:@Configurationpublic class RedisConfig {@Beanpublic RedisTemplate<S
项目场景:
在单机情况下,用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常量池这个娘胎里一样吧。
最后感谢各位兄得的支持,希望我的这篇文章可以帮到你们,为你们节约宝贵的时间,如果本篇文章有什么错误的地方,我希望大佬能帮我指出来,好了解自己的不足,岁月静好,愿与诸位共同进步,谢谢大家。
更多推荐
所有评论(0)