1、什么是Redis分布式锁

  • Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
  • 所谓的占坑,就是一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁;也可以配合EXPIRE key seconds自动释放锁;设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除

2、Redis分布式锁的缺陷

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。

3、实现一个Redis分布式锁

redis分布式非阻塞锁 redis分布式锁缺陷_时间段

redis分布式非阻塞锁 redis分布式锁缺陷_Redis_02


redis分布式非阻塞锁 redis分布式锁缺陷_redis_03

4、应用场景

解决Redis的并发竞争key的问题:

  • 也就是多个系统同时对一个key进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同

使用分布式锁来解决这个问题。

5、官方实现:RedLock

RedLock是Redis官方提出的权威的基于Redis实现的分布式锁,此种方式比原先的单节点的方法更安全。它可以保证以下特性:

  1. 安全特性:互斥访问,即永远只有一个 client 能拿到锁
  2. 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区
  3. 容错性:只要大部分 Redis 节点存活就可以正常提供服务

使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击)