Redis面试题(四)

2023-09-20 16:29:08


前言

  1. 锁互斥机制
  2. watch dog 自动延期机制
  3. 可重入加锁机制
  4. 释放锁机制
  5. 上述 Redis 分布式锁的缺点
  6. 使用过 Redis 分布式锁么,它是怎么实现的?

`

一、锁互斥机制

那么在这个时候,如果客户端 2 来尝试加锁,执行了同样的一段 lua 脚本,会咋样呢?很简单,第一个 if 判断会执行“exists myLock”,发现 myLock 这个锁 key 已经存在了。接着第二个 if 判断,判断一下,myLock 锁 key 的 hash 数据结构中,是否包含客户端 2 的 ID,但是明显不是的,因为那里包含的是客户端 1 的 ID。
所以,客户端 2 会获取到 pttl myLock 返回的一个数字,这个数字代表了 myLock 这个锁 key的 剩余生存时间。比如还剩 15000 毫秒的生存时间。此时客户端 2 会进入一个 while 循环,不停的尝试加锁。


二、watch dog 自动延期机制

客户端 1 加锁的锁 key 默认生存时间才 30 秒,如果超过了 30 秒,客户端 1 还想一直持有这把锁,怎么办呢?
简单!只要客户端 1 一旦加锁成功,就会启动一个 watch dog 看门狗, 他是一个后台线程,会每隔 10 秒检查一下,如果客户端 1 还持有锁 key,那么就会不断的延长锁 key 的生存时间。


三、 可重入加锁机制

那如果客户端 1 都已经持有了这把锁了,结果可重入的加锁会怎么样呢?比如下面这种代码:
这时我们来分析一下上面那段 lua 脚本。 第一个 if 判断肯定不成立,“exists myLock”会显示锁key 已经存在了。 第二个 if 判断会成立,因为 myLock 的 hash 数据结构中包含的那个 ID,就是客户端 1 的那个 ID,也就是“8743c9c0-0795-4907-87fd-6c719a6b4586:1”
此时就会执行可重入加锁的逻辑,他会用:
incrby myLock 8743c9c0-0795-4907-87fd-6c71a6b4586:1 1 ,通过这个命令,对客户端 1的加锁次数,累加 1。此时 myLock 数据结构变为下面这样:
大家看到了吧,那个 myLock 的 hash 数据结构中的那个客户端 ID,就对应着加锁的次数


四、释放锁机制

如果执行 lock.unlock(),就可以释放分布式锁,此时的业务逻辑也是非常简单的。其实说白了,就是每次都对 myLock 数据结构中的那个加锁次数减 1。如果发现加锁次数是 0 了,说明这个客户端已经不再持有锁了,此时就会用:“del myLock” 命令,从 redis 里删除这个 key。
然后呢,另外的客户端 2 就可以尝试完成加锁了。这就是所谓的 分布式锁的开源 Redisson 框架的实现机制。
一般我们在生产系统中,可以用 Redisson 框架提供的这个类库来基于 redis 进行分布式锁的加锁与释放锁。

五、 上述 Redis 分布式锁的缺点

其实上面那种方案最大的问题,就是如果你对某个 redis master 实例,写入了 myLock 这种锁key 的 value,此时会异步复制给对应的 master slave 实例。但是这个过程中一旦发生 redis master 宕机,主备切换,redis slave 变为了 redis master。
接着就会导致,客户端 2 来尝试加锁的时候,在新的 redis master 上完成了加锁,而客户端 1
也以为自己成功加了锁。此时就会导致多个客户端对一个分布式锁完成了加锁。这时系统在业务语义上一定会出现问题, 导致各种脏数据的产生。
所以这个就是 redis cluster,或者是 redis master-slave 架构的主从异步复制导致的 redis 分布式锁的最大缺陷:在 在 redis master 实例宕机的时候,可能导致多个客户端同时完成加锁。


六、使用过 Redis 分布式锁么,它是怎么实现的?

先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了,那会怎么样?
set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和 expire 合成一条指令来用的!


总结

  1. 锁互斥机制
  2. watch dog 自动延期机制
  3. 可重入加锁机制
  4. 释放锁机制
  5. 上述 Redis 分布式锁的缺点
  6. 使用过 Redis 分布式锁么,它是怎么实现的?
更多推荐

npm、yarn、pnpm如何清除缓存?

前端工程化创建项目会经常使用各种安装包管理工具,安装各种前端依赖包。例如,npm、yarn、pnpm等。时间一长,各种安装包管理工具的在安装依赖时,留下的缓存文件就会变得很大,以至于影响系统的运行,因此必要时清除缓存就是一个不错的选择。本文将着重介绍npm、yarn、pnpm清除缓存的方法。一、Npm1、查看缓存路径要

LLaMA参数微调方法

1.AdapterTuning:嵌入在transformer中新增了一个名为adapter的结构,其核心思想是保持模型其他原始参数不变,只改变adapter的参数,其结构如下图所示:1.在每一个transformer模块最后都加入一层adapter。2.adapter首先使用一个feedforward将高维特征映射到了

打造生产级Llama大模型服务

对于任何想要尝试人工智能或本地LLM,又不想因为意外的云账单或API费用而感到震惊的人,我可以告诉你我自己的旅程是如何的,以及如何开始使用廉价的消费级硬件执行Llama2推理。这个项目一直在以非常活跃的速度发展,这使得它非常令人兴奋。这也意味着你在这里阅读的任何内容都可能会发生变化,就像我使用的有缺陷的模型转换一样,它

Web 第一步:HTTP 协议(基础)

这里是JavaWeb的开头部分!那么先解释一下吧:Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。JavaWeb:是用Java技术来解决相关Web互联网领域的技术栈。(JavaWebB/S概述图)HTTP协议(客户端与服务器交互的一种通讯方式)所谓交互就是“请求”和“响应”。而“协议”就是双方约定

【库函数】Qt中Json的操作

参考博客:https://www.cnblogs.com/ybqjymy/p/17264853.htmlhttps://www.jb51.net/article/260149.htmhttps://blog.csdn.net/cpp_learner/article/details/118421096之前介绍了许多C++

QT实现相关功能

1、文本的保存mianwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QFontDialog>//字体对话框#include<QFont>//字体类#include<QMessageBox>//消息对话框#inclu

企业申请ISO9001体系认证审核,流程分几步走?

ISO9001质量管理体系认证流程1.前期准备工作①建立文件化的质量管理体系;②质量管理体系运行三个月以上;③至少进行过一次内部质量管理体系内审与管理评审,且内审已覆盖所有的场所和标准条款;④提供质量手册及程序文件。2.信息交流与相关人士进行信息交流,通过人员互访、电话、传真、电子部件等方式相互了解,确定实施认证的初步

Meow

环境准备操作系统:KaliLinux或者Windows工具:nmap,telnetnmap工具[Kali官网]手册地址:https://www.kali.org/tools/nmap/摘要:Nmapisautilityfornetworkexplorationorsecurityauditing.Itsupportsp

1989-2022年企业排污许可证信息库数据(24万观测值)

1989-2022年企业排污许可证信息库数据(24万观测值)1、时间:1989-2022年2、指标:企业名称、登记状态、法定代表人、注册资本、成立日期、核准日期、所属省份、所属城市、所属区县、电话、更多电话、邮箱、更多邮箱、统一社会信用代码、纳税人识别号、注册号、组织机构代码、参保人数、企业类型、所属行业、曾用名、英文

Blender 学习笔记(一)

文章目录视图的移动右侧小键摄像机跟随调整摄像机的窗口比例当前角度变成拍摄视角视图(正视图,顶视图,侧视图)物体的对焦物体的移动,旋转,放大与缩小加选框选全选添加物体物体删除视图的移动shift+鼠标中键=平移鼠标中键=旋转中键滚轮=缩放右侧小键搜索键(放大与缩小),手掌(平移),摄像机(0键进入),正交与透视视图切换(

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据,一季度,光是抖音,旅游达人发布视频数量就高达175万条,播放量1350亿次,收获27亿次点赞。在这一趋势下,许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短视频如抖音也已开始布局酒旅赛道且势头渐盛。虽然行业竞争加剧,但传统OTA平台地位似乎依旧稳如磐石。9月5日,携程发

热文推荐