redis分布式锁的实现
2023-03-20 15:17:42 时间
一.正常加锁
当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。
具体步骤:
获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据库,释放锁资源。
二.线程出现阻塞
当A线程加锁后出现阻塞时,导致数据还没有存到数据库,锁的时间便会失效。
B线程便会执行,对数据进行加锁,成功后保存到数据库,而这时A线程启动,将数据保存到数据库,这时的数据便又会重复。
解决方法:
对锁进行延期,加锁成功后新建一个守护线程,监控锁的过期时间,如果这个时间小于设置的时间,则会自动延期
问题:1.为何使用守护线程
不一定要用守护线程,只要能保证对锁进行延期即可
2.为何要设置过期时间
为了避免出现特殊情况,导致锁一直留在redis中,不能释放,比如:断电,删除锁失败
三.网上对线程的说法
极端情况下以上的思路还是可能出现问题,比如:
- 有两个线程A,B一前一后执行
- A线程正常执行,但是执行业务时间较长,并且守护线程阻塞或者延期失败,导致锁自动过期
- B线程又来加锁,之后A线程继续执行,最后释放锁,其实A线程加的锁已经过期,释放的是B线程的锁
解决方法:
- 在执行setIfAbsent方法时,给key设置一个唯一值,如加uuid
- 在释放锁时,先判断value对不对,再释放
但是这个说法不是我们加锁的初衷,而且没意义,我们加锁就是为了:避免多个线程同时执行这段代码,但网上这个说法明显是支持多线程同时执行
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假