Redis分布式锁是一种在分布式系统中,利用Redis的原子操作特性实现的锁机制,用于保护共享资源的并发访问。
原理
原子性与互斥性
Redis分布式锁的核心原理在于利用Redis的某些原子操作(如`SETNX`、`GETSET`、`SET`带特定选项等)来确保锁的获取与释放操作是原子性的,从而保证了锁的互斥性,即同一时刻只有一个客户端能持有锁。
- `SETNX`(Set if Not Exists):当给定的key不存在时,设置key的值为给定的value,并返回1(设置成功);如果key已经存在,则不做任何操作并返回0(设置失败)。利用`SETNX`,客户端可以尝试创建一个唯一标识的锁key,只有第一个成功创建的客户端才能获得锁。
自动过期与锁续期
为了避免死锁,通常会在锁key上设置一个过期时间(TTL),当持有锁的客户端崩溃或者未能及时释放锁时,锁会自动过期并释放,允许其他客户端获取锁。
- `EXPIRE`或`PEXPIRE`:在获取锁后立即为锁key设置一个过期时间,确保即使客户端异常,锁也会在一定时间后自动释放。
- 锁续期(Keepalive):在客户端持有锁期间,定期刷新锁的过期时间,防止锁在业务处理尚未完成时提前过期。这通常通过客户端轮询或使用Redis的`PEXPIRE`命令(带有超时参数的`WATCH` + `MULTI` + `EXEC`事务)来实现。
可重入性与公平性
可重入性:某些实现允许同一个客户端在已经持有锁的情况下再次获取该锁,即递归锁。这通常通过在锁值中保存客户端标识和锁计数来实现。
公平性:在某些场景下,可能需要保证锁的获取按照请求到达的顺序进行,即先请求的客户端优先获得锁。实现公平性通