Redis分布式锁
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis分布式锁,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1843字,纯文字阅读大概需要3分钟。
内容图文
![Redis分布式锁](/upload/InfoBanner/zyjiaocheng/877/b28d6884460a4af3b94c89f00ffc729a.jpg)
应用场景:
当多个应用进程(客户端)需要互斥地访问共享资源时,可以使用分布式锁。其中Redis官方权威提出了RedLock。Java中可使用Redssion提供的实现。
注意点:
- 互斥,保证任何时刻只能有一个客户端 获取到锁;
- 效率之死锁,保证获取到锁的客户端即使在出现网络分区或者宕机的情况下,也能释放掉锁;
- 效率之容错,保证只要大多数Redis节点正常工作,客户端就能正常获取到锁和正常释放锁。
原理:
获取锁:
SET resource_name my_random_value NX [EX|PX] 30000
Redssion中的实现使用了Hash, 可重入:
if (redis.call(‘exists’, KEYS[1]) == 0)
then redis.call(‘hset’, KEYS[1], ARGV[2], 1);
redis.call(‘pexpire’, KEYS[1], ARGV[1]);
return nil;
end;
if (redis.call(‘hexists’, KEYS[1], ARGV[2]) == 1)
then redis.call(‘hincrby’, KEYS[1], ARGV[2], 1);
redis.call(‘pexpire’, KEYS[1], ARGV[1]);
return nil;
end;
return redis.call(‘pttl’, KEYS[1]);
释放锁:
if redis.call(“get”,KEYS[1]) == ARGV[1] then
return redis.call(“del”,KEYS[1])
else
return 0
end
Redisson的释放锁实现:
if (redis.call(‘hexists’, KEYS[1], ARGV[3]) == 0)
then return nil;
end;
local counter = redis.call(‘hincrby’, KEYS[1], ARGV[3],
-1);
if (counter > 0)
then redis.call(‘pexpire’, KEYS[1], ARGV[2]);
return 0;
else redis.call(‘del’, KEYS[1]);
redis.call(‘publish’, KEYS[2], ARGV[1]);
return 1;
end;
return nil;
Redis分布锁常见的几种实现方案:
-
单机
缺点:单点故障,整个服务无法使用。 -
主从复制
缺点:failover问题。 根本原因在于主从复制有延迟。当master在slave复制成功前宕机,slave晋升为master时没有宕机时的锁信息,导致有可能出现两个客户端同时持有同一把锁。
举例:
a. client A 在master拿到锁
b. master节点把A创建的锁信息同步到slave之前宕机了
c. slave晋升为master节点
d. client B 在新master拿到与A相同的锁(此时A以为自己仍持有锁)
…TODO
Redisson使用DEMO代码片段:
使用Redisson加锁 释放锁业务代码
内容总结
以上是互联网集市为您收集整理的Redis分布式锁全部内容,希望文章能够帮你解决Redis分布式锁所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。