当前位置: 首页>后端>正文

Redis实现分布式锁的原理分析

上一篇 <<<Redis的过期机制使用场景示例
下一篇 >>>Redis分布式锁的实现代码示例

分布式锁的概念

本地锁:在多个线程中,保证只有一个线程执行(线程安全的问题)
分布锁:在分布式中,保证只有一个jvm执行(多个jvm线程安全问题)
如果我们服务器是集群的时候,定时任务可能会重复执行 可以采用分布式锁解决

分布式锁的实现方案

a、基于数据库方式实现
b、基于Zk方式实现 采用临时节点+事件通知
c、基于Redis方式实现 setnx 方式
d、基于Redisson方式实现

分布式锁的应用场景

1.分布式任务调度平台保证任务的幂等性。
2.分布式全局id的生成

Redis实现分布式锁的思路

Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。
获取锁
核心:多个不同的jvm 同时创建一个相同的标记(全局唯一的) 只要谁能够创建成功谁就能够获取锁
redis:创建一个相同的标记使用Setnx命令,因为Redis key必须保证是唯一的,只要谁能够创建成功谁就能够获取锁
释放锁
核心:释放该全局唯一的标记,其他的jvm重新进入到获取锁资源。
redis:对key设置一个有效期(可避免死锁),或者主动删除该key
超时锁(没有获取锁、已经获取锁)
a、设置等待获取锁的超时时间
b、已经获取到锁,设置锁的有效期5s

在分布式锁中如果超时了如何处理

设置获取锁和使用锁的超时时间。
redis分布式锁判断超时的时候,只要计算执行时间就可以了,不用去redis里判断一下key是否存在。

如何提高分布式锁的效率

a、降低锁的粒度(没必要的放在锁之外,业务逻辑尽可能的简单)
b、不同的业务使用不同的锁,不要全部使用同一把锁

Redis中SetnX与Set命令的区别

Set命令的时候:如果key不存在则创建,如果key已经存在则修改原值;
SetNx命令: 如果key不存在则创建 返回1,如果已经存在则不执行任何操作返回0

ZK的分布式锁参考后续提供的文章内容。。。

推荐阅读:
<<<分布式缓存与本地缓存的区别
<<<Ehcache基础知识
<<<SpringBoot整合Ehcache
<<<Redis的5种数据类型
<<<Redis存放实体对象的方式及区别
<<<Redis的应用场景汇总
<<<Redis高效及线程安全的真正原因
<<<Redis为啥要分为16个库
<<<RDB和AOF持久化方式的区别
<<<Redis与数据库的一致性解决方案
<<<SpringBoot整合Redis的注解版本完成数据缓存
<<<Redis的淘汰策略
<<<Redis的事务操作(Mult和Watch)知识点
<<<Redis的过期机制使用场景示例
<<<Redis分布式锁的实现代码示例
<<<使用Redisson工具实现分布式锁
<<<Redis集群模式之主从复制原理及存在的缺陷
<<<Redis集群模式之哨兵模式
<<<Redis集群模式之Cluster去中心化分片集群
<<<Linux环境下安装单机Redis
<<<Redis Cluster集群环境搭建
<<<Redis Cluster如何动态扩容与缩容
<<<Redis Cluster主从节点自动切换
<<<Redis集群模式的类型和缺陷汇总
<<<Redis缓存的穿透、击穿和雪崩效应
<<<Redis解决穿透击穿问题时使用的布隆过滤器知识点
<<<Redis与MySQL的数据同步解决方案
<<<阿里云的Canal框架实现Redis与Mysql同步原理及代码示例
<<<阿里云的Canal框架配置
<<<Redis官方提出的redlock分布式锁
<<<Redis的调优设置
<<<Redis常见问题汇总


https://www.xamrdz.com/backend/35d1921217.html

相关文章: