怎么在单节点上实现分布式锁?

发布于 2019-12-19 22:26:26
关注者
0
被浏览
1352
1 个回答
  • 面试哥
    面试哥 2019-12-19
    为面试而生,有面试问题,就找面试哥。

    SET resourcename myrandom_value NX PX 30000

    主要依靠上述命令,该命令仅当 Key 不存在时(NX保证)set 值,并且设置过期时间 3000ms (PX保证),值 myrandomvalue 必须是所有 client 和所有锁请求发生期间唯一的,释放锁的逻辑是:

    lua if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end

    上述实现可以避免释放另一个client创建的锁,如果只有 del 命令的话,那么如果 client1 拿到 lock1 之后因为某些操作阻塞了很长时间,此时 Redis 端 lock1 已经过期了并且已经被重新分配给了 client2,那么 client1 此时再去释放这把锁就会造成 client2 原本获取到的锁被 client1 无故释放了,但现在为每个 client 分配一个 unique 的 string 值可以避免这个问题。至于如何去生成这个 unique string,方法很多随意选择一种就行了。

面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看