Redis分布式锁,一般用Redisson框架,非常的简便易用。例如:
Rlocklock= redisson.getLock(“myLock”);
lock.lock();
lock.unlock();
此外,Redisson还支持redis单实例、redis哨兵、redis cluster、redis master-slave等各种部署架构,都可以完美实现。
加锁机制
执行lock.lock()代码时,如果该客户端面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器。紧接着,就会发送一段lua脚本到redis上:
脚本中有三个参数:KEYS[1]代表的是加锁的那个key,即上面代码中的“myLock”。
ARGV[1]代表的就是锁key的生存时间,默认30秒。
ARGV[2]代表的是加锁的客户端的ID,比如这样:
8743c9c0-0795-4907-87fd-6c719a6b4586:1
脚本的逻辑如下:第一个if:
先判断有没有“myLock”这个锁(即使用exists myLock命令),如果没有就进行加锁。加锁是使用hset myLock命令,即hset myLock
8743c9c0-0795-4907-87fd-6c719a6b4586:1。这行命令执行后,会出现一个类似下面的数据结构:
myLock:
{
“8743c9c0-0795-4907-87fd-6c719a6b4586:1”:1
}
上述就代表“
8743c9c0-0795-4907-87fd-6c719a6b4586:1”这个客户端对“myLock”这个锁key完成了加锁。接着会执行“pexpire myLock 30000”命令,设置myLock这个锁key的生存时间是30秒。好了,到此为止,加锁完成了。
总结一下加锁过程:
首先选择一台机器,然后发送一段lua脚本,带有三个参数:一个是锁的名字(在代码里指定的)、一个是锁的时常(默认30秒)、一个是加锁的客户端id(每个客户端对应一个id)。然后脚本会判断是否有该名字的锁,如果没有就往数据结构中加入该锁的客户端id。
网友评论