当前位置: 首页 > news >正文

redis面试(六)分布式锁开篇

什么是分布式锁?

在我们的分布式服务中,如果不同的系统服务,不同的 线程,要针对同一个资源进行修改。 小的维度比如是一行数据,大的维度比如是某一批数据的处理过程。
我们要保证这个修改过程的原子性,那么就把这个过程用一个锁包裹起来,每个线程进行处理的时候都要先获取到这把锁,如果获取不到的话就证明有其他线程正在处理。 等其他线程处理完之后,当前线程才能接着处理。

其实本质上分布式锁与单个数据库的锁没有多大区别。无非就是这个竞争的资源是所有线程,所有服务可见的。

适用于什么场景?

最常见的就是订单逻辑中了吧, 下单的时候,要保证生单成功,并且货物冻结成功。 这两个步骤必须要一起处理,要么一起成功,要么一起失败。

而订单和商品的服务大概率是分开的,所以涉及到两个服务的时候,就要锁定这个资源。锁定资源处理过程中,不能被其他的线程竞争到。

或者是支付逻辑中,数据库的支付状态修改和第三方一定是原子性的。并且这个过程持续的时候,支付状态不能被其他线程或者服务修改,比如超时取消。

总结一下:就是在分布式服务环境下,保证同一时刻只有一个线程(进程)获取资源,多线程(多进程)互斥的一种锁
那么,主要做的就是让这个锁资源在所有的服务器中都可以看见。并且具有高效的增删改查功能。

zk和redis的区别

zk

zookeep也有分布式锁的实现,而且实现的原理也是比较简单的,某个节点尝试创建临时的znode,成功了就证明是获取这个锁成功了。
其他客户端来创建同名锁失败,那就注册一个监听器来监听这个锁,一旦znode被释放掉的话,就会去再次竞争创建这个同名znode临时节点。 之后我们可以单开一章把zk的分布式锁代码逻辑分析一下。

redis

简单来说,就是在redis中,加一个key。加成功了,就代表锁获取成功了。
其他线程来加这个key的时候,判断一下是否存在,如果存在的话,证明这个锁已经被其他线程占用了,要进入等待。
这中间会有很多问题,比如,线程卡死了,锁资源一直不释放,那就造成死锁了,该怎么办?
再比如,线程不知道锁失效了,再去进行解锁的时候,这个锁还是原来的吗?
还有就是,如果redis也是分布式多节点的话,会不会有问题?
后面我们就通过分析源码的方式,把这些问题一一都回答出来。 各位兄弟姐妹如果有其他问题的话也可随时提出来。

题外话

为什么这里要分析redis锁,因为工作中使用缓存接触最多的就是redis,而且redis有一个比较流行的分布式锁组件redisson,我们就是要分析redisson的源码。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTML5+CSS3笔记(Xmind格式):第三天
  • 详细分析python下载文件的两种方式(附Demo)
  • SonarQube详细说明: 为Kotlin项目保驾护航
  • 【数值计算方法】23维高斯积分的python实现
  • git revert和git reset工作中使用
  • Prometheus 常见参数
  • 【自学深度学习梳理3】卷积神经网络
  • 【链表OJ】常见面试题 3
  • Linux kill命令给进程发信号
  • 寻找二叉树中两个节点的最低公共祖先
  • 2024小学生古诗文大会暑期备考:吃透历年真题和知识点(持续)
  • 简单的docker学习 第1章 docker 概述
  • springcloud loadbalancer nacos无损发布
  • 【数据结构】线段树
  • 临床数据科学中如何用R来进行缺失值的处理(上)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • DataBase in Android
  • Facebook AccountKit 接入的坑点
  • js作用域和this的理解
  • MySQL QA
  • Netty源码解析1-Buffer
  • Vim Clutch | 面向脚踏板编程……
  • WebSocket使用
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 爱情 北京女病人
  • 测试开发系类之接口自动化测试
  • 给github项目添加CI badge
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 两列自适应布局方案整理
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何进阶一名有竞争力的程序员?
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​iOS安全加固方法及实现
  • #14vue3生成表单并跳转到外部地址的方式
  • (11)MSP430F5529 定时器B
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Git) gitignore基础使用
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (生成器)yield与(迭代器)generator
  • (四)进入MySQL 【事务】
  • (四)事件系统
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (杂交版)植物大战僵尸
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)程序员疫苗:代码注入
  • (转)创业家杂志:UCWEB天使第一步
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ./和../以及/和~之间的区别
  • .net mvc 获取url中controller和action
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰