Redis 分布式锁
- SETNX(SET If Not Exists):当且仅当 Key 不存在时,则可以设置,否则不做任何动作。
- SETEX:可以设置超时时间
- GETSET命令:设置新值并返回旧值,以此来释放锁或解决死锁。 原理是删除锁或将原来的锁值替换成新值。
其原理为:通过 SETNX 设置 Key-Value 来获得锁,随即进入死循环,每次循环判断,如果存在 Key 则继续循环,如果不存在 Key,则跳出循环,当前任务执行完成后,删除 Key 以释放锁。这种方式可能会导致死锁,为了避免这种情况,需要设置超时时间。
值得一提的是Redis 官方推荐 Redlock 来实现分布式锁 ,能够解决之前redis分布式锁的以下缺陷
- 高并发的情况下,如果两个线程同时进入循环,可能导致加锁失败。
- SETNX 是一个耗时操作,因为它需要判断 Key 是否存在,因为会存在性能问题。
基本逻辑
多节点redis实现的分布式锁算法(RedLock):有效防止单点