privatevoidrecordErrorTimes(LoginInfoReqreq,StringerrorTimesKey){StringerrorTimes=stringRedisTemplate.opsForValue().get(errorTimesKey);Booleanresult=stringRedisTemplate.opsForValue().setIfAbsent(errorTimesKey,"1",BasicConstants.CACHE_TIME_5,TimeUnit.MINUTES);if(!Boolean.TRUE.equals(result)){ //是fa
redisTemplate使用setIfAbsent返回null问题原理及解决办法1.简介有的时候我们使用redisTemplate给锁设置超时时间的方法,设置锁并返回的lock有可能不是true或false,而是null。Booleanlock=redisTemplate.opsForValue().setIfAbsent("redisTemplateTest锁住了","value",10,TimeUnit.SECONDS);从上图我们可以看出虽然生成了锁,但是返回的lock却是null,这就会影响我们下面的代码运行。下面我先说一下可能的产生原因和解决办法,之后再详细说一下原理。2.产生原因
再集群环境中,存在定时任务多次执行,浪费资源,那么如何避免这种情况呢,下面就说明一下如何利用一个注解解决问题,利用切面配合redis可以简单实现分布式锁,解决定时任务重复执行的问题。直接上干货了,感觉不对的朋友勿喷,请划过。实现逻辑和基本原理逻辑:1、每一次访问进来都先去获得redis锁如果获得到则继续执行,如果获取不到则直接返回2、redis的key设有过期时间避免某个请求处理不当(或方法执行到一半宕机或网络原因)导致rediskey不能正确释放死锁3在finally方法里进行手工释放锁基本原理(即有什么样的理论基础才可以用redis做分布式锁):1、setIfAbsent即setnx当ke
浅析redissetIfAbsent的用法及在分布式锁上的应用及同步锁的缺陷一、业务场景:同步锁的问题与分布式锁的应用1、redis的基本命令(1)SETNX命令(SETifNoteXists)语法:SETNXkeyvalue功能:当且仅当key不存在,将key的值设为value,并返回1;若给定的key已经存在,则SETNX不做任何动作,并返回0。(2)expire命令语法:expireKEYseconds功能:设置key的过期时间。如果key已过期,将会被自动删除。(3)DEL命令语法:DELkey[KEY…]功能:删除给定的一个或多个key,不存在的key会被忽略。2、实现同步锁原理(1