Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案

Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案

超时和失效(非原子性)问题

原子性问题 :上锁时存入线程名称,删除时要先判断锁内的名称是不是自己的,是再删除,但是后面的判断和删除非原子性 ,会有并发安全问题。
不可重入问题 :一个线程只能获取一次锁,之后就无法再获取了就是不可重入
失败重试问题 :synchronized获取锁失败会阻塞,当前使用redis,setnx失败就返回了
一致性问题 :Redis主从集群,主节点set锁之后,从节点还没同步时,主节点宕机,从节点变为主节点,这样其他线程也可以获取锁

解决方案

LUA脚本 :使用LUA脚本可以把多条命令作为一条命令执行,使其具有原子性
Watch Dog :看门狗机制,会一直查看锁的过期时间,任务只要没执行完,就会再重置锁的时间
HASH重入次数 :synchronized可重入是内部记录了锁名称和进入锁的次数,Redis使用hash结构可以实现
pub sub :解决失败重试,获取锁失败将锁放入失败队列,获取锁成功通知失败队列让其再去获取锁
RedLock :Redis提供的解决分布式数据一致性问题的算法.

相关推荐
代码的余温36 分钟前
SQL性能优化全攻略
数据库·mysql·性能优化
手把手入门3 小时前
★CentOS:MySQL数据备份
数据库·mysql·adb
SelectDB3 小时前
5000+ 中大型企业首选的 Doris,在稳定性的提升上究竟花了多大的功夫?
大数据·数据库·apache
路多辛3 小时前
Golang database/sql 包深度解析(二):连接池实现原理
数据库·sql·golang
写bug写bug3 小时前
分布式锁的使用场景和常见实现(下)
分布式·后端·面试
SimonKing4 小时前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员
杰克尼5 小时前
MYSQL-175. 组合两个表
数据库·mysql
DemonAvenger5 小时前
MySQL索引原理深度解析与优化策略实战
数据库·mysql·性能优化
189228048615 小时前
NY270NY273美光固态闪存NY277NY287
服务器·网络·数据库·科技·性能优化
星霜笔记9 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb