转载请注明出处:https://www.cnblogs.com/rolayblog/p/10643193.html

背景

项目中有一个定时同步任务,但是程序发布在多台服务器上,就意味着,在固定的时间多台服务器可能会拿到相同的数据,并且同时处理这个定时同步任务,这时候就可能会引发一系列的问题,比如死锁,如果任务中有发送消息给用户,那就会出现重复发送的情况。

Redis SETNX key value 简介

该命令全称为 SET if Not eXists,所以如果已将存在的key,再次Set会返回false,反之为true。总所周知,redis为单线程的,这里用来做分布式资源锁的管理是再好不过的了。

使用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         }

伪代码