面试题:分布式锁,谈谈设计思路和方案

2023-11-03

面试官:项目有用到分布式锁吗?谈谈设计思路和方案

答:主要根据具体的业务场景展开描述(这边各个项目不一样,就不展开说了),主要是引入redis实现的分布式锁,应该保证互斥性(在任何时候只有一个客户端持有锁,使用setnx)不能死锁(设置过期时间)保证上锁和解锁是同一个客户端(设置不同的value值),业务时间太长,导致锁过期(设置看门狗,自动续锁),锁的重入性(使用redis的hset)。

如果在一个分布式系统中,我们从数据库中读取一个数据,然后修改保存,这种情况很容易遇到并发问题。因为读取和更新保存不是一个原子操作,在并发时就会导致数据的不正确。如果是单机应用,直接使用本地锁就可以避免。如果是分布式应用,应用部署在多个JVM中,没有办法控制,所以引入分布式锁来解决。

互斥性

127.0.0.1:6379> setnx lock value1 #在键lock不存在的情况下,将键key的值设置为value1
(integer) 1
127.0.0.1:6379> setnx lock value2 #试图覆盖lock的值,返回0表示失败
(integer) 0
127.0.0.1:6379> get lock #获取lock的值,验证没有被覆盖
"value1"
127.0.0.1:6379> del lock #删除lock的值,删除成功
(integer) 1
127.0.0.1:6379> setnx lock value2 #再使用setnx命令设置,返回0表示成功
(integer) 1
127.0.0.1:6379> get lock #获取lock的值,验证设置成功

加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。

解锁:使用del命令,通过删除键值释放锁。

不能死锁

设置过期时间,到点数据删除,避免导致如果一个客户端持有锁的期间突然崩溃了,就会导致无法解锁,则其他人将无法拿到该锁,锁会一直存在,最终导致出现死锁的现象。

锁过期

有效时间设置多长,假如我的业务操作比有效时间长,我的业务代码还没执行完就自动给我解锁了,不就完蛋了吗。

这个问题就有点棘手了,在网上也有很多讨论,第一种解决方法就是靠程序员自己去把握,预估一下业务代码需要执行的时间,然后设置有效期时间比执行时间长一些,保证不会因为自动解锁影响到客户端业务代码的执行。但是这并不是万全之策,比如网络抖动这种情况是无法预测的,也有可能导致业务代码执行的时间变长,所以并不安全。有一种方法比较靠谱一点,

就是给锁续期。在Redisson框架实现分布式锁的思路,就使用watchDog机制实现锁的续期。当加锁成功后,同时开启守护线程,默认有效期是30秒,每隔10秒就会给锁续期到30秒,只要持有锁的客户端没有宕机,就能保证一直持有锁,直到业务代码执行完毕由客户端自己解锁,如果宕机了自然就在有效期失效后自动解锁。

保证上锁和解锁都是同一个客户端

key的值可以根据业务设置,比如是用户中心使用的,可以命令为USER_REDIS_LOCK,value可以使用uuid保证唯一,用于标识加锁的客户端,保证加锁和解锁都是同一个客户端。

每次解锁可以先判断锁的value是不是当前用户,如果是,说明可以解锁,如果不是,则不能解锁,会导致误解了其他人的锁。

锁的重入性

可重入锁意思是在外层使用锁之后,内层仍然可以使用,那么可重入锁的实现思路又是怎么样的呢?在Redisson实现可重入锁的思路,使用Redis的哈希表存储可重入次数,当加锁成功后,使用hset命令,value(重入次数)则是1。

解锁时,先判断可重复次数是否大于0,大于0则减一,否则删除键值,释放锁资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题:分布式锁,谈谈设计思路和方案 的相关文章

  • 高德地图的简单使用:点击标记获取经纬度和详细地址

    准备工作 1 先进入高德开发平台注册登录 2 进入地图 js Api 按照步骤申请key 3 使用npm安装依赖包 npm i amap amap jsapi loader save 4 高德api 都有说明 下面看下我实现的功能和代码 弹
  • hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】

    首先hutool已经为我们封装好了远程调用的接口 我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参 contend type为application json RequestMapp
  • 计算机键盘运算符号输入,电脑上感叹号怎么打出来(电脑键盘符号大全)

    01 在使用键盘输入标点符号时 大部分都可以直接通过键盘按键或者按Ctrl 键盘按键直接输入 比如按下shift 1 就可以输入感叹号 中文状态下按反斜杠键就可以输入顿号 其实在键盘上的很多同一个按键 中文状态下和英文状态下是不一样的 如下
  • King 【POJ - 1364】【差分约束+SPFA+卡了判负环的进队次数】

    题目链接 题目大意 n个数的一个序列 m个条件 si ni oi ki 代表了序列中第si个数到第si ni个数的和大于或小于ki gt 大于 lt 小于 问是否存在相悖的约束 op为gt时 sum si ni sum si 1 gt ki
  • 宽带远端服务器无响应什么意思,宽带远程服务器无响应

    宽带远程服务器无响应 内容精选 换一换 已成功添加目标环境 如果目标环境处于在线状态 只允许修改目标环境名称 如果目标环境处于离线状态 可以输入登录远程服务器的用户名和密码重新部署分析辅助软件 如果目标环境处于在线状态 只允许修改目标环境名
  • 10.12技术沉淀

    cpp 编写程序实现ADT表的定义 及常用操作 1 判断表是否为空 2 获取第i个节点的内容 3 删除 4 插入 include
  • 全局变量/局部变量/静态变量

    1 全局变量 全局变量是在所有函数体的外部定义的 程序的所有部分 其他文件的代码 都可以使用 全局变量不受作用域的影响 全局变量的生命周期一直到程序的结束 全局变量是静态存储方式 如果在一个文件中使用extern关键字来声明另一个文件中存在
  • 论文-- 基于 证据理论 的 不确定信息 度量与融合应用

    摘要 1 工程应用 不确定信息 1 模糊集合 表示的 模糊信息 2 语义上不一致或非特异性 造成的 歧义信息 3 开放世界特性 导致的 非完备信息 1 不确定信息的处理 基于证据理论 2 不确定信息分类 封闭世界 空集的基本概率指派函数值为
  • ConvNeXt网络详解

    ConvNeXt 论文名称 A ConvNet for the 2020s 论文下载链接 https arxiv org abs 2201 03545 论文对应源码链接 https github com facebookresearch C
  • 【论文学习】YOLOv3:An Incremental Improvement

    论文 YOLOv3 源代码 pjreddie com yolo 视频 https youtu be MPU2HistivI 1 Abstract 作者对YOLO进行了进一步的更新 做了一些小设计更改让其表现更好 YOLOv3比YOLOv2相
  • 【OS】IO系统——设备管理

    操作系统的设备管理 IO系统 一 啥是IO系统 操作系统是一种特殊的管理系统 管理与计算机相关的各种资源 往大了说 包括硬件资源和软件资源 细化了说 包括计算资源 内存资源 文件资源 设备资源 本文主要讲解设备管理的相关内容 1 OS管理的
  • 一分钟总结Spring的IOC和DI

    IOC Inverse of control 控制反转 IoC 控制反转 就是将程序中原来 new 对象 交给spring创建 从spring工厂获取对象 使用spring来负责控制对象的生命周期和对象间的关系 Spring所倡导的开发方式
  • 数据库视图的基本概念及作用

    一 视图简介 视图是从一个或几个基本表 或视图 中导出的虚拟的表 在系统的数据字典中仅存放了视图的定义 不存放视图对应的数据 视图是原始数据库数据的一种变换 是查看表中数据的另外一种方式 可以将视图看成是一个移动的窗口 通过它可以看到感兴趣
  • vcruntime140.dll丢失的解决方法

    vcruntime140 dll是vc运行库中的链接库文件 一般它会出现的状况就是系统提示dll丢失 这样的情况一般出现在游戏应用或者软件程序中 且会导致程序无法正常运行 只要下载此补丁 根据下面的步骤进行操作即可解决问题若你的电脑不小心丢
  • 前端常用js加密方法

    这里罗列前端常用的js加密方法 base64加密
  • 计算机网络知识点(网络层)

    文章目录 重要内容 4 1 网络层提供的两种服务 4 2 网际协议IP 4 2 1 虚拟互联网络 4 2 2 分类的IP地址 4 2 3 IP地址与硬件地址 4 2 4 地址解析协议ARP 4 2 5 IP数据报的格式 4 2 6 IP层转
  • 关于Android证书MD5获取

    Android打包证书获取MD5值 最近在学习Android开发 在打包成apk时发现需要一个证书文件 于是就随手生成了一个证书文件 在后期使用百度人脸识别SDK时发现需要用到证书文件的MD5值 按照百度说明文档以及网上大多数查看证书文件的
  • Centos7安装配置nginx

    1 前言 在进行nginx安装前 考虑到本博客针对很多新手朋友我决定还是先介绍一些nginx知识 这样更加有利于各位读者朋友对nginx的理解 对后续学习也有很大帮助 介绍 Nginx engine x 是一个高性能的HTTP和反向代理we

随机推荐