Redis 面试常见问答

本文出自: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.rhkb.cn/news/137427.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop3.x搭建到集群调优

一、基础环境安装 https://blog.csdn.net/fen_dou_shao_nian/article/details/120945221 二、hadoop运行环境搭建 2.1 模板虚拟机环境准备 0)安装模板虚拟机,IP 地址 192.168.10.100、主机名称 hadoop100、内存 4G、硬盘 50G 1)hadoop100…

字符串函数

目录 一、求字符串长度 strlen 用法: 注意: 二、长度不受限制的字符串函数 strcpy 用法: 注意: strcat 用法: 注意: 用例: strcmp 用法: 三、长度受限制的字符串函数介…

QT实现钟表

1、 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPaintEvent> //绘制事件类 #include <QDebug> //信息调试类 #include <QPainter> //画家类 #include <QTimerEve…

使用Python构建强大的网络爬虫

介绍 网络爬虫是从网站收集数据的强大技术&#xff0c;而Python是这项任务中最流行的语言之一。然而&#xff0c;构建一个强大的网络爬虫不仅仅涉及到获取网页并解析其HTML。在本文中&#xff0c;我们将为您介绍创建一个网络爬虫的过程&#xff0c;这个爬虫不仅可以获取和保存网…

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理

图解直接映射&#xff08;Direct mapped&#xff09;、全相联&#xff08;Fully-associative&#xff09;和组相联&#xff08;Set-associative&#xff09;cache 一&#xff0c;直接映射缓存&#xff08;Direct mapped caches&#xff09;1.1 直接映射示例1.2 直接映射原理1.3…

flink集群与资源@k8s源码分析-总述

1 简介 集群和资源模块提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。本文分析flink的集群和资源的k8s模块,深入了解其设计原理,为开发自有的集群和资源组件做技术准备, 同时涉…

Canal实现Mysql数据同步至Redis、Elasticsearch

文章目录 1.Canal简介1.1 MySQL主备复制原理1.2 canal工作原理 2.开启MySQL Binlog3.安装Canal3.1 下载Canal3.2 修改配置文件3.3 启动和关闭 4.SpringCloud集成Canal4.1 Canal数据结构![在这里插入图片描述](https://img-blog.csdnimg.cn/c64b40c2231a4ea39a95aac81d771bd1.pn…

python装13的一些写法

一些当你离职后&#xff0c;让老板觉拍大腿的代码 1. any(** in ** for ** in **) 判断某个集合元素&#xff0c;是否包含某个/某些元素 代码&#xff1a; if __name__ __main__:# 判断 list1 中是否包含某个/某些元素list1 [1,2,3,4]a any(x in [5,4] for x in list1) 输…

【AI语言模型】阿里推出音视频转文字引擎

一、前言 阿里的音视频转文字引擎可以正式使用&#xff0c;用户可体验所有AI功能&#xff0c;含全文概要、章节速览、发言总结等高阶AI功能。通过阿里云主账号登录&#xff0c;可享受以下权益&#xff1a; 每日登录&#xff0c;自动获得2小时转写时长&#xff1b; 每邀请1名好…

python项目2to3方案预研

目录 官方工具2to3工具安装参数解释基本使用工具缺陷 future工具安装参数解释基本使用工具缺陷 python-modernize工具安装参数解释基本使用工具缺陷 pyupgrade工具安装参数解释基本使用工具缺陷 对比 官方工具2to3 2to3 是Python官方提供的用于将Python 2代码转换为Python 3代…

Jenkins学习笔记4

配置构建流程&#xff1a; Jenkins任务创建&#xff1a; 1&#xff09;创建新任务&#xff1a; 把这个Accept first connection改成 No Validation。问题得到解决。 构建触发器这块暂时没有需要配置的。 传输文件到nginx-server这个web服务器中。 将文件上传到/usr/share/n…

Django(18):中间件原理和使用

目录 概述Django自带中间件Django的中间件执行顺序自定义中间件函数使用类 其它中间件钩子函数process_viewprocess_exceptionprocess_template_response如何使用这3个钩子函数&#xff1f; 全局异常处理小结 概述 中间件(middleware)是一个镶嵌到Django的request(请求)/respo…

Learn Prompt-Prompt 高级技巧:Agents 组件详解

在以LLM驱动的Agent系统中&#xff0c;LLM扮演着Agent的大脑角色&#xff0c;并辅以几个关键组件&#xff1a; 规划&#xff1a;LLM能够进行全面的规划&#xff0c;不仅仅是简单的任务拆分。它可以评估不同的路径和策略&#xff0c;制定最佳的行动计划&#xff0c;以实现用户给…

MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])

MongoDB使用配置文件启动、添加为系统服务及设置自启动 1.是什么2.下载安装启动配置2.1 下载2.2 安装2.3 配置2.4 使用配置文件启动 3.设置系统服务及自启动3.1 设置为系统服务3.2 自启动 1.是什么 【以下内容来自ChatGPT3.5】 MongoDB是一个流行的开源文档型数据库管理系统&a…

41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传

1. 说明 这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。 2. FTP环境搭建 在linux系统中,需要安装vsftpd,可以在终端中输入下面的命令进行安装: sudo apt-get install vsftpd使用上述命令安装后,系统中会有一…

ChunJun(OldNameIsFlinkX)

序言 ChunJun主要是基于Flink实时计算框架,封装了不同数据源之间的数据导入与导出功能.我们只需要按照ChunJun的要求提供原始与目标数据源的相关信息给Chunjun,然后它会帮我们生成能运行与Flink上的算子任务执行,这样就避免了我们自己去根据不同的数据源重新编辑读入与读出的方…

学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集

文章目录 1.模数转换器&#xff08;ADC&#xff09;是什么&#xff1f;手册说明&#xff1a; 2.STC32G单片机ADC使用原理19.1.1 ADC控制寄存器&#xff08;ADC_CONTR)19.1.2 ADC配置寄存器&#xff08;ADCCFG)19.1.4ADC时序控制寄存器&#xff08;ADCTIM&#xff09;19.3 ADC相…

CSS盒子模型、列表样式

盒子模型 常用的html标签都可以看作一个盒子&#xff0c;称为盒子模型 盒子由四部分组成&#xff1a; content、padding、border、margin 边框 border:border-width&#xff08;粗细&#xff09; | border-style(样式) | border-color&#xff08;颜色&#xff09; #one{bor…

云原生的简单理解

一、何谓云原生&#xff1f; 一种构建和运行应用软件的方法 应用程序从设计之初即考虑到云的环境&#xff0c;原生为云而设计&#xff0c;在云上以最佳姿势运行&#xff0c;充分利用和发挥云平台的弹性分布式优势。 二、包括以下四个要素 采用容器化部署&#xff1a;实现云平…