键“1”= = 1){
关键lockSeconds到期
还真
其他} {
返回假
}
}
布尔解锁(String键){
DEL键
}
tryLock是一个非阻塞的分布式锁方法,在获得锁失败后会立即返回。...此种方法看似没有什么问题,但其实则有一个漏洞:在加锁的过程中,客户端顺序的向复述,服务器发送了SETNX和到期命令,那么假设在SETNX命令执行完成之后,在到期命令发出去之前客户端发生崩溃(或客户端与复述...>
当复述,服务器收到这样的指令序列时,C1和C2的SETNX都同时返回了1,此时C1和C2都认为自己拿到了锁,这种情况明显是不符合预期的。...客户端可以使用GETSET命令去设置自己的过期时间,然后得到的返回值与之前买到的返回值进行比较,如果不同,则表示这个过期的锁被其他客户端抢占了(此时GETSET命令其实已经生效,也就是关键中说的过期时间已经被修改...(有些同学会提到复述的管道特性,此处明显不适用,因为第二条指令的执行以来与第一条执行的结果,管道无法实现)
另外,上面的分布式锁还有一个问题,那就是服务器之间时间同步的问题。