Tech 导读 本文主要从以下几个方面介绍Redis分布式锁:1、为什么要有分布式锁?2、分布式锁特性(五大特性 非常重要) 3、分布式锁特性2之不会发生死锁 4、分布式锁特性3:解铃还须系铃人 5.分布式锁特性4之可重入性 6、如何解决过期时间确定和业务执行时长不确定性的问题:看门狗机制
01
为什么要有分布式锁
JUC的锁和分布式锁都是一种保护系统资源的措施。尽可能将并发带来的不确定性转换为同步的确定性;
02
分布式锁特性
特性1:互斥性。在任意时刻,只有一个客户端能持有锁。
特性2:不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
特性3:解铃还须系铃人。加锁和解锁必须是同一个客户端(线程),客户端自己不能解别人加的锁。
特性4:可重入性。同一个现线程已经获取到锁,可再次获取到锁。
特性5:具有容错性。只要大部分的分布式锁节点正常运行,客户端就可以加锁和解锁。
常见分布式锁的三种实现方式:
1. 数据库锁;2. 基于ZooKeeper的分布式锁;3. 基于Redis的分布式锁。
注意,上锁时,设置key和设置超时时间这两个操作是原子性的,要么都执行,要么都不执行。
Redis原生支持:
// http://redis.io/commands/set.html
SET key value [EX seconds] [PX milliseconds] [NX|XX]
不要在代码里边分两次调用: