为什么需要分布式锁
在分布式环境中,多个进程或多个节点同时操作共享资源时,可能会发生数据竞争和冲突的情况,这时就需要引入分布式锁来保证资源的安全访问和操作。
分布式锁的特点
首先为了确保分布式锁可用,我们至少要确保分布式锁的实现同时满足以下条件:
1.互斥性
在分布式系统环境下,一个方法在同一时间,只能被一个机器的一个线程执行。
任意时刻,只能有一个客户端获取锁,不能同时有两个客户端获取到锁。
2.避免死锁
获取锁的客户端因为某些原因,花了太长时间处理,或者客户端发生了故障(比如:down机等),锁无法释放会导致整个处理流程无法进行下去,所以要避免死锁。
最常见的是通过设置一个 TTL,Time To Live,存活时间,来避免死锁。
3.容错特性
就是当部分节点,比如:redis节点等down机时,客户端仍然能够获取锁和释放锁,为避免单点故障,锁服务需要具有一定容错性。
比如:锁服务本身是一个集群(Redis集群),单点出现故障,可以通过集群自动故障切换来解决容错的问题。
Redis分布式锁原理
Redis分布式锁是一种基于Redis实现的分布式系统中常用的锁机制,用于解决多个进程或多个节点之间的并发访问问题。
以下是Redis分布式锁的实现原理,主要分为如下步骤:
1.获取锁
当一个进程或节点需要获取锁时,它会向Redis发送一个特定的命令,例如SET key value NX PX milliseconds
。
其中,key
是唯一标识锁的键,value
是用于标识锁的值,NX
表示仅在键不存在时才设置,PX
表示设置键的过期时间。
这个命令的含义是,在给定的键不存在时,设置键的值为指定的值,并设置过期时间,从而获得锁。
2.锁的竞争
多个进程或节点同时请求获取锁时,只有一个进程或节点能够成功设置键的值,获得锁。其他进程或节点会因为键已经存在而无法设置。
3.锁的超时
为了避免死锁情况的发生,锁通常会设置一个合理的过期时间。
当持有锁的进程或节点完成任务后,可以释放锁,通过发送DEL key
命令删除键,释放锁资源。如果锁的过期时间到达,Redis会自动删除键,释放锁。
4.锁的可重入性
有些场景下,同一个进程或节点需要多次获取同一把锁,这时可以使用锁的可重入性。
可重入锁允许持有锁的进程或节点多次获取锁而不会发生阻塞,只需保持相同的锁键和值即可。
5.锁的安全性
为了确保锁的安全性,需要保证锁的获取和释放是原子操作。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获知最新一线技术干货!
