1、什么是Redis分布式锁
- Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
- 所谓的占坑,就是一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁;也可以配合
EXPIRE key seconds
自动释放锁;设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除
2、Redis分布式锁的缺陷
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
3、实现一个Redis分布式锁
4、应用场景
解决Redis的并发竞争key的问题:
- 也就是多个系统同时对一个key进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同
使用分布式锁来解决这个问题。
5、官方实现:RedLock
RedLock是Redis官方提出的权威的基于Redis实现的分布式锁,此种方式比原先的单节点的方法更安全。它可以保证以下特性:
- 安全特性:互斥访问,即永远只有一个 client 能拿到锁
- 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区
- 容错性:只要大部分 Redis 节点存活就可以正常提供服务
使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击)