分布式锁的使用与注意事项
发布日期:2022-03-18 18:19:11 浏览次数:4 分类:技术文章

本文共 1074 字,大约阅读时间需要 3 分钟。

此文是2021年第一篇博客,计划每2周写一篇博客。

分布式锁的使用与注意事项

分布式锁介绍

最近项目需要用到分布式锁,在网上看了挺多写分布式锁的文章,于是打算写一篇关于分布式锁的文章。

单机的服务不需要用分布式锁,多线程抢夺同一资源,在内存中使用锁就可以了。

分布式锁适用于多台机器抢夺同一资源。多台机器抢夺同一资源一般有以下情况:

1.微服务系统中,同一个接口同样的参数可能会被上游连续调用2次,想要保护自身系统的一致性和幂等性,在接口入口处进行分布式锁的操作是很有必要的。

2.在一个服务中,一笔单据可能被不同的定时任务/接口捞起,会重复调用下游接口,使用分布式锁可以保护下游。

从上面列举的2种情况可以看出,分布式锁必须是独立的第三方。

目前最流行的分布式锁是Redis分布式锁,下面介绍一下Redis分布式锁的使用方法。

使用方法

Redis支持当key不存在时设置一个Key,因此把一个共享资源作为Key,就可以实现分布式锁。

set key value nx

其中nx表示当Key不存在时设置key,如果Key已经存在,不进行设置。

等程序运行结束,需要释放资源时,把锁删除就可以了:

del key

但这样直接使用分布式锁有以下几个问题:

1.如果获取锁的程序出现了异常,没有删除锁,那么后续这个资源就无法被其他程序使用了。因此锁需要设置过期时间。

2.锁有过期时间后出现了第二个问题。如果程序A执行的时间过长,导致锁失效;锁失效后程序B拿到锁,如果此时A释放了B的锁,那么C也可以拿到锁了。为了解决这个问题,需要在设置value的时候选择一个随机字符串,删除锁的时候需要先判断value是否为自己设置的value。

因此最终的用法如下:

set key random_string nx px 10000

其中px 10000表示该key的过期时间为10秒。

总结

上文提到的分布式锁的用法就是最常见的Redis分布式锁的用法,但也有缺点。因为分布式锁有过期时间,程序A始终有可能执行时间过长导致锁失效,比如JVM GC暂停了很久,程序A以为锁没失效,仍会进行资源的访问。

参考大佬文章:可以得出以下观点:

1.如果使用分布式锁是为了效率,防止不同客户端做重复的任务。即使锁失效了,也能保证幂等性,或者无需幂等性保证,那么单节点的Redis锁就够用了。

2.如果使用Redis锁是为了正确性,任何情况都不允许锁失效,那么分布式锁不适合这个场景,更推荐使用事务型数据库进行上锁操作,比如select…for update。

参考资料:

转载地址:https://zhang0peter.blog.csdn.net/article/details/112689625 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IDEA-Java自动生成单元测试
下一篇:Qt最新版5.14在Windows环境静态编译安装和部署的完整过程 VS 2019-Qt static link build Windows 32 bit/64 bit

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月20日 09时41分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

《学习 Go 语言》学习心得 2019-04-27
[汇编语言] 带有颜色的字符串显示(hello world 级别程序) 2019-04-27
[增删改查] Python 之使用 Django + LayUI 做后台管理 2019-04-27
Docker 镜像容器 之 导出导入、上传镜像到 DockerHub 上、Nexus私库 的引入 2019-04-27
centos7 下将 Django2.0 项目部署到 阿里云 上(uwsgi3 +Nginx ) 2019-04-27
前后端分离 SpringBoot + SpringSecurity + JWT + RBAC 实现用户无状态请求验证 2021-06-30
[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2021-06-30
在 Centos7 下使用 Docker 快速搭建 Hadoop 集群 2021-06-30
Python web 框架 Flask 蓝图的正确使用姿势 2021-06-30
领扣LintCode算法问题答案-1053. 至少是其他数字两倍的最大数 2021-06-30
领扣LintCode算法问题答案-1054. 最少费用的爬台阶方法 2021-06-30
领扣LintCode算法问题答案-1056. 请找出大于目标的最小字母 2021-06-30
领扣LintCode算法问题答案-1062. 洪水填充 2021-06-30
领扣LintCode算法问题答案-1068. 寻找数组的中心索引 2021-06-30
领扣LintCode算法问题答案-1071. 词典中最长的单词 2021-06-30
领扣LintCode算法问题答案-1078. 数组的度 2021-06-30
领扣LintCode算法问题答案-1079. 连续子串计数 2021-06-30
领扣LintCode算法问题答案-1080. 最大的岛 2021-06-30
【精】LintCode领扣算法问题答案:1082. 员工的重要度 2021-06-30
领扣LintCode算法问题答案-1085. 最长的单一路径 2021-06-30