手动实现一个Redis分布式锁 手工创建一个Redis分布式锁
手动实现一个Redis分布式锁
IT电脑小知识篇,关于手动实现一个Redis分布式锁方面的讲解,如有不对的地方欢迎指正!
今天第一天开工,收拾心情,又要开始好好学习,好好工作了。
对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。
但是因为这些封装好的组建,让我们越来越懒。
我们使用一些封装好的开源组建时,可以了解其中的原理,或者自己动手写一个,可以更好提升你的技术水平。
今天我就教大家用原生的 Redis,手动撸一个 Redis 分布式锁,很有意思。
1、问题引入
其实通过 Redis 实现分布式锁,经常会有面试官会问,很多同学都知道用 SetNx() 去获取锁,解决并发问题。
SetNx() 是什么?我简单解答一下。
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
对于下面 2 种问题,你知道如何解决么?
- 如果获取锁的机器挂掉,如何处理?
- 当锁超时时,A、B 两个线程同时获取锁,可能导致锁被同时获取,如何解决?
这个就是我们实现 Redis 分布式锁时,需要重点解决的 2 个问题。
2、理论知识
刚才说过,通过 SetNx() 去获取锁,可以解决并发问题。
当获取到锁,处理完业务逻辑后,会将锁释放。

但当机器宕机,或者重启时,没有执行 Del() 删除锁操作,会导致锁一直没有释放。
所以,我们还需要记录锁的超时时间,判断锁是否超时。

这里我们通过 GetKey() 获取锁的超时时间 A,通过和当前时间比较,判断锁是否超时。
如果锁未超时,直接返回,如果锁超时,重新设置锁的超时时间,成功获取锁。
还有其它问题么?当然!
因为在并发场景下,会存在 A、B 两个线程同时执行 SetNx(),导致两个线程同时获取到锁。
那如何解决呢?将 SetNx() 用 GetSet() 替换。

GetSet() 是什么?我简单解答一下。
Redis Getset 命令用于设置指定 key 的值,并返回 key 的旧值。
这里不太好理解,我举个例子。
假如 A、B 两个线程,A 先执行,B 后执行:
- 对于线程 A 和 B,通过 GetKey 获取的超时时间都是 T1 = 100;
- 对于线程 A,将超时时间 Ta = 200 通过 GetSet() 设置,返回 T2 = 100,此时满足条件 “T1 == T2”,获取锁成功;
相关阅读
-
广域网 WAN的主要特点是什么
如果想知道的相关介绍,接下来IT袋网小编为大家介绍。 广域网(Wide Area Network)跨越更大的地理区域,通常连接不同城市、国家甚至大洲的设备。 特点 广泛范围: WAN的范围非常广泛,可以连
-
数据库中的acid是什么意思
对于许多网友来说数据库中的acid是什么意思的相关话题,接下来IT袋网小编为大家介绍。 我们说到数据库的时候,常常提到其 ACID 属性。那么 ACID 是什么意思呢? ACID 是用来 描述数据库事务
-
5G-Advanced优势有哪些
关于这方面的知识你知道吗?5G-Advanced优势有哪些的电脑小知识,下面为详细的介绍。 容量提升与速度飞跃 5G Advanced将继续挑战7 GHz以下和毫米波频谱的频谱效率限制。通过不断优化MIMO技术,
-
GPU是什么:GPU的基础知识与应用领域
跟大家聊一聊GPU是什么的相关介绍,下面小编为您详细解答 1. GPU的基本概念 GPU(Graphics Processing Unit),中文名为图形处理器,是计算机中负责处理图形和图像运算的硬件设备。 在现代计算机


