美文网首页大数据Java
最近面试我喜欢问 Redis,明天我来问问Redis加锁机制是怎

最近面试我喜欢问 Redis,明天我来问问Redis加锁机制是怎

作者: 热衷技术的Java程序员 | 来源:发表于2020-06-09 19:01 被阅读0次

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。

相关文章

网友评论

    本文标题:最近面试我喜欢问 Redis,明天我来问问Redis加锁机制是怎

    本文链接:https://www.haomeiwen.com/subject/eluetktx.html