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的分布式锁参考后续提供的文章内容。。。


推荐阅读:
<<<分布式缓存与本地缓存的区别
<< << << << << << << << << << << << << << <<<使用Redisson工具实现分布式锁
<< << << << << << << << << << << <<<阿里云的Canal框架实现Redis与Mysql同步原理及代码示例
<<<阿里云的Canal框架配置
<< << <<

你可能感兴趣的:(Redis实现分布式锁的原理分析)