Redis 面试常见问答

news2024/11/29 6:39:16

本文出自:https://thinkinjava.cn

作者:莫那 鲁道

1. 什么是缓存雪崩?怎么解决?

alt

一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。

如何解决呢?

alt

2 种策略(同时使用):

  • 对缓存做高可用,防止缓存宕机

  • 使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入 DB,保证部分可用,其余的请求返回断路器的默认值。

2. 什么是缓存穿透?如何解决?

解释 1:缓存查询一个不存在的键,同时数据库也没有该键,如果黑客大量使用这种方式,将导致数据库宕机。

解决方案:我们可以采用一个默认值来避免,例如,当访问一个不存在的键时,然后再去查询数据库,如果仍然没有找到,则在缓存中放置一个占位符。下次请求到来时,检查该占位符,如果存在占位符,就不再查询数据库,以防止数据库宕机。

解释 2:大量请求查询一个刚刚失效的键,导致数据库压力倍增,可能会导致宕机,但实际上,这些请求都是查询相同的数据。

解决方案:可以在这些请求代码中添加双重检查锁。尽管这些请求的处理时间会变长,但总比数据库宕机要好。

3. 什么是缓存并发竞争?如何解决?

解释:多个客户端同时写入同一个键,如果顺序错乱,数据就会不正确。但我们无法控制写入的顺序。

解决方案:使用分布式锁,如 ZooKeeper,并加入数据的时间戳。在同一时刻,只有成功抢到锁的客户端才能进行写入操作,并且在写入时,需要比较当前数据的时间戳和缓存中数据的时间戳。

4. 什么是缓存与数据库双写不一致?如何解决?

解释:连续写入缓存和数据库,但在操作过程中发生并发操作,导致数据不一致。

通常情况下,更新缓存与数据库有以下几种顺序:

  • 先更新数据库,再更新缓存。

  • 先删除缓存,再更新数据库。

  • 先更新数据库,再删除缓存。

对这三种方式的优劣进行分析:

先更新数据库,再更新缓存。

这种方式存在的问题是:当有两个请求同时更新数据时,如果没有使用分布式锁,则无法控制最终缓存中的值将是多少。即存在并发写入时的问题。

先删除缓存,再更新数据库。

这种方式存在的问题是:如果在删除缓存之后,有客户端读取数据,可能会读取到旧数据,并且有可能将旧数据设置回缓存,导致缓存中的数据一直是旧数据。

针对这个问题有两种解决方案:

  • 使用"双删",即第一次删除后再次删除,将最后一步的删除操作设置为异步操作,以防止在客户端读取操作时设置了旧值。

  • 使用队列,在该键不存在时将其放入队列中,串行执行,必须等待数据库更新完成后才能读取数据。

总的来说,这些解决方案都比较麻烦。

先更新数据库,再删除缓存。

这是一种常用的方式,但很多人并不知道,这种方式称为Cache Aside Pattern,是由外国人发明的。如果先更新数据库再删除缓存,会出现在更新数据库之前可能会有一段时间数据不是最新的情况。

同时,如果在更新之前缓存正好失效,在写入客户端完成删除操作后又设置了旧值,这是一个非常巧合的情况。

有两个前提条件:缓存在写入之前失效,同时写入客户端删除操作结束后立即设置旧数据 - 即读取操作比写入慢。另外,某些写入操作可能会造成表锁定。

所以,这种情况很少发生,但如果发生了怎么办?使用"双删"!记录更新期间是否有客户端读取数据库,如果有,在数据库更新完成后执行延迟删除。

还有一种可能,如果在执行更新数据库之前准备执行删除缓存操作时服务挂了,导致删除操作失败怎么办?可以通过订阅数据库的binlog来进行删除操作。

顶尖架构师栈

关注回复关键字

【C01】超10G后端学习面试资源

【IDEA】最新IDEA激活工具和码及教程

【JetBrains软件名】 最新软件激活工具和码及教程

工具&码&教程

转载: https://mp.weixin.qq.com/s/mG3q5UpXcRQoxdvoZZ7Xmg

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust踩雷笔记(7)——两个链表题例子初识裸指针

目录 leetcode 234leetcode 19 leetcode 234 题目在这https://leetcode.cn/problems/palindrome-linked-list/,leetcode 234的回文链表,思路很简单,就是fast和slow两个指针,fast一次移动两个、slow一次一个,最后slow指…

2023年华数杯数学建模A题隔热材料的结构优化控制研究解题全过程文档及程序

2023年华数杯全国大学生数学建模 A题 隔热材料的结构优化控制研究 原题再现: 新型隔热材料 A 具有优良的隔热特性,在航天、军工、石化、建筑、交通等高科技领域中有着广泛的应用。   目前,由单根隔热材料 A 纤维编织成的织物,…

这可是网络工程师零基础学习路线最完整,最详细的版本,没有之一

文章篇幅较长,耐心看完你一定有所收获。 相比IT类的其它岗位,网络工程师的学习方向是比较明亮的。想要成为网络工程师,华为认证就是最好的学习方法。而网络工程师的从零开始学习就是从华为认证的初级开始学起,也就是HCIA&#xff…

【Linux基础】第28讲 Linux Vi编辑器

在Linux下一班使用Vi编辑器来编辑文件vi既可以查看文件也可以编辑文件而vim是vi的升级版本,具备更多的功能。vi如果目标文件不存在,会创建新的文件。但如果新文件没做编辑,退出后还会消失。 VI的三种模式介绍 三种模式(状态&…

rv1126-rv1109-NFS功能

//adb可以直接放,优先使用,nfs是另一种调试方法 adb push E:\111\RkLunch.sh /data//放进data文件夹 / 打开Network File Systems </

常见web漏洞原理整理

文章目录 一、SQL注入1.1SQL注入漏洞原理1.2 SQL注入的两个关键点1.3 与Mysql注入相关的知识点1.4 SQL注入的主要分类1.5 SQL注入的流程1.5.1 普通SQL注入1.5.2 盲注 1.6 SQL注入总结 二、文件上传2.1 文件上传漏洞原理2.2 客户端检测及绕过&#xff08;JS检测与绕过&#xff0…

虹科CiA演讲回顾 | CAN(FD)总线协议转换原理及其在汽车行业的应用

2023年9月14日&#xff0c;CiA中国技术日直播活动在线上举行&#xff0c;该活动致力于开展与CAN总线相关领域的技术工作&#xff0c;演讲者都是CAN领域的专家。虹科首席工程师陈皓受邀参与活动&#xff0c;并带来以“CAN和CAN FD总线协议转换”为主题的演讲。 本次演讲内容主要…

【完美世界】烧烤小队!天元甲胄,石昊铭刻万灵图,斩杀仙殿传人

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界。 完美世界动画最新集预告更新了&#xff0c;天元秘境的最高殿堂正式开启&#xff0c;里面有无数珍宝&#xff0c;更有无上传承&#xff0c;于是又将是一场腥风血雨的争夺战。尤其是魔王荒与仙殿传人的终极决战&…

2D游戏开发和3D游戏开发有什么不同?

2D游戏开发和3D游戏开发是两种不同类型的游戏制作方法&#xff0c;它们之间有一些显著的区别&#xff1a; 1. 图形和视觉效果&#xff1a; 2D游戏开发&#xff1a; 2D游戏通常使用二维图形&#xff0c;游戏世界和角色通常在一个平面上显示。这种类型的游戏具有平面的外观&…

Docker文档阅读笔记-How to Commit Changes to a Docker Image with Examples

介绍 在工作中使用Docker镜像和容器&#xff0c;用得最多的就是如何提交修改过的Docker镜像。当提交修改后&#xff0c;就会在原有的镜像上创建一个新的镜像。 本博文说明如何提交一个新的Docker镜像。 前提 ①有一个可以直接访问服务器的运行终端&#xff1b; ②帐号需要r…

10.模板方法模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 一 模板方法模式练习-试卷 UML图 测试代码 #include <iostream> using namespace std;class T…

红帽社区论坛

https://access.redhat.com/ https://access.redhat.com/ 是红帽公司的官方网站&#xff0c;提供了许多与红帽企业级Linux发行版及其他开源软件相关的服务和资源。以下是该网站的一些主要功能&#xff1a;文档和知识库&#xff1a;提供了关于红帽产品的详细文档、手册、技术文章…

Blender 学习笔记(一)

文章目录 视图的移动右侧小键摄像机跟随调整摄像机的窗口比例当前角度变成拍摄视角视图&#xff08;正视图&#xff0c;顶视图&#xff0c;侧视图&#xff09;物体的对焦物体的移动&#xff0c;旋转&#xff0c;放大与缩小加选框选全选添加物体物体删除 视图的移动 shift 鼠标…

JavaScript之观察者模式

本文作者为 360 奇舞团前端开发工程师 概述 在日常开发中&#xff0c;开发人员经常使用设计模式来解决软件设计中的问题。其中&#xff0c;观察者模式是一种常用的模式&#xff0c;它可以帮助开发人员更好地处理对象之间的通信。在 JavaScript 中&#xff0c;观察者模式的应用非…

关于第一届全球电子纸创新应用金奖征集评选及报名指南

重要通知 &#xff5c;关于第一届全球电子纸创新应用金奖征集评选及报名指南https://mp.weixin.qq.com/s/RWsZtmJ20-NZXMG0k0rwPA?wxwork_useridEPIA 从2004年&#xff0c;Sony推出全球首款电纸书阅读器至今20载&#xff0c;这期间&#xff0c;到底诞生了多少种创新产品&#…

国外访问学者面签需要注意什么?

国外访问学者面签是前往国外进行学术研究或合作的关键一步&#xff0c;因此需要谨慎准备。以下是知识人网小编整理的一些需要注意的重要事项&#xff0c;以确保面签顺利进行&#xff1a; 1.签证申请材料准备&#xff1a;首先&#xff0c;要仔细阅读所申请国家的签证要求&#x…

【Git】02-Git常见应用

文章目录 1. 删除不需要分支2. 修改最新Commit的Message3. 修改之前Commit的Message4. 连续多个Commit整理为一个5. 不连续的Commit整理为一个6. 比较暂存区和HEAD中文件差异7. 比较工作区和暂存区中文件差异8. 将暂存区恢复为HEAD相同9. 工作区文件恢复和暂存区相同10. 取消暂…

git提示:remote origin already exists

目录 问题场景 问题原因 问题解决 问题场景 在GitLab中新建仓库后&#xff0c;然后将本地项目提交提示&#xff1a;remote origin already exists. 问题原因 error: remote origin already exists. 错误&#xff1a;远程源点已存在&#xff08;翻译&#xff09; 出现该错误的…

华为云云耀云服务器L实例评测|基于L实例安装Prometheus+Grafana插件实现数据可视化监控

文章目录 一、云耀云服务器介绍二、安装Prometheus创建prometheus.service配置文件启动prometheus服务查看prometheus服务进程三、安装node_exporter下载node_exporter组件包创建node_exporter.service配置文件启动node_exproter服务配置prometheus.yml文件访问Prometheus四、安…

蓝桥杯每日一题2023.9.16

蓝桥杯2022年第十三届省赛真题-X进制减法 - C语言网 (dotcpp.com) 题目描述 进制规定了数字在数位上逢几进一。 X 进制是一种很神奇的进制&#xff0c;因为其每一数位的进制并不固定&#xff01;例如说某种 X 进制数&#xff0c;最低数位为二进制&#xff0c;第二数位为十进…