对于如何实现分布式锁,方法有很多,这里介绍下使用redis setnx的实现方式。
首先分析下为什么 redis setnx 能实现分布式锁功能。
第一 redis本身相对于我们的多实例分布式应用程序来说,它是可全局共享的,每个实例都能访问同一个redis服务器(有点废话了)。
第二 redis的操作都是原子性的。
第三 来看下redis的setnx 特点。
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
实例演示
redis> EXISTS job # job 不存在
(integer) 0
redis> SETNX job "programmer" # job 设置成功
(integer) 1
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
(integer) 0
redis> GET job # 没有被覆盖
"programmer"
好了,上代码(其中redisUtils就不贴代码了):
public void lock(){
String lockKey = "lock";
long lock = redisUtils.setnx(lockKey, "1");
int i = 0;
while (lock < 1){
i ++;
if (i > 30){
//30次后无法取得锁
throw new Exception("无法获取锁");
}
Thread.sleep(50);
lock = redisUtils.setnx(lockKey, "1");
}
//成功获取到锁,
dosomesing();
redisUtils.del(lockKey);
}
public void dosomesing(){
System.out.println("正在执行。。。");
}
在dosomesing中去执行你需要保证同步的业务就ok了。
总结:
用redis setnx做分布式锁,只是一个小技巧而已,其最重要的原理,记住一条:Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值