转载请注明出处:https://www.cnblogs.com/rolayblog/p/10643193.html
背景
项目中有一个定时同步任务,但是程序发布在多台服务器上,就意味着,在固定的时间多台服务器可能会拿到相同的数据,并且同时处理这个定时同步任务,这时候就可能会引发一系列的问题,比如死锁,如果任务中有发送消息给用户,那就会出现重复发送的情况。
Redis SETNX key value 简介
该命令全称为 SET if Not eXists,所以如果已将存在的key,再次Set会返回false,反之为true。总所周知,redis为单线程的,这里用来做分布式资源锁的管理是再好不过的了。
代码实现(伪代码)
1 String lockKey=lockKey;//唯一值,例如主键 2 String lockValue=UUID.randomUUID().toString(); 3 //使用redis SETNX 4 boolean flagSuc=SETNX(lockKey,lockValue,outtime); 5 if(flagSuc) 6 { 7 //获取锁成功 8 }else 9 { 10 //获取锁失败 其他服务器正在操作该资源 11 } 12 //操作完成后手动释放资源锁 13 String theLockValue=getNX(lockKey); 14 //验证独占锁value值,防止释放掉其他服务器的锁 15 if(theLockValue.equals(lockValue)) 16 { 17 //remove 18 }