首页 > 数据库 >Redis 面试常见问答

Redis 面试常见问答

时间:2023-09-20 16:04:06浏览次数:41  
标签:缓存 删除 宕机 写入 数据库 Redis 更新 面试 问答

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

作者:莫那 鲁道

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

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

如何解决呢?

2 种策略(同时使用):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

顶尖架构师栈

关注回复关键字

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

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

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

工具&码&教程

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

标签:缓存,删除,宕机,写入,数据库,Redis,更新,面试,问答
From: https://www.cnblogs.com/dc-s/p/17717561.html

相关文章

  • redis cluster三主六从 redis三主三从集群搭建
    转自:https://blog.51cto.com/u_16099166/6885197一、下载安装二、本文架构(三台服务器,每台部署两个节点,主从同步,生产最好是部署六台服务器): 三、进入redis安装目录,复制redis.conf文件,建立从节点配置文件1#进入redis安装目录2cdredis34#复制redis.conf文件5cpredis.......
  • redis三主三从哨兵模式 redis三主三从集群
    转自:https://blog.51cto.com/u_16213559/7033634conf复制/usr/local/src/redis-6.2.6文件夹下redis.conf文件到/usr/local/src/master-slave文件夹中命名为redis6381.conf1#允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不......
  • 架构师面试必备:高并发限流算法全攻略
    Hello大家好,我是小米!今天我要和大家聊一聊一个在技术面试中经常被问到的问题——高并发限流算法!这个话题非常有趣,也是我们在日常工作中经常会碰到的挑战之一。在本文中,我将详细介绍一些常见的高并发限流算法,以及它们适用的不同场景。什么是高并发限流在开始探讨高并发限流算法之前,......
  • 解决安装VS2022时,出现未能安装包"Microsoft.VisualCpp.Redist.14,version=14.32.31332
    解决安装VS2022时,出现未能安装包"Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86"问题描述之前安装过MSSQLServer和VS2022,但是后来又卸载了。现在重装VS2022出现两个报错:无法安装Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86无法安装Micr......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉搜索树的最近公共祖先
    题目:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root= [6,2......
  • #yyds干货盘点# LeetCode程序员面试金典:建立四叉树
    1.简述:给你一个 n*n 矩阵 grid ,矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。你需要返回能表示矩阵 grid 的四叉树的根结点。四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:val:储存叶子结点所代表的区域的值。1对应 True,0对......
  • PHP面试题2
    1.$a='b';$b='$a';$c="$b";$d="$$a";$e=$$a;echo$c.PHP_EOL;//$aecho$d.PHP_EOL;//$becho$e.PHP_EOL;//$aif($a==0){echo0;}else{echo1;}//02.浏览器输入url后发生了什么?1.DNS对域名进行解析;2.建立TCP连接(......
  • 金九银十就业季,Android工程师如何在面试中提升印象分?
    又到了金九银十的就业季,在面试过程中提升印象分是非常重要的。想要在面试中脱颖而出吗?下面是几个建议,小编希望大家可以借鉴一下。一、提前做足准备在参加面试之前,你应该做足准备。这包括了解公司的背景、业务模式、文化和价值观,以及与招聘的职位相关的技能和职责。刷刷该公司历年的......
  • 【面试题精讲】Mysql如何实现乐观锁
    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址文章更新计划系列文章地址在MySQL中,可以通过使用乐观锁来实现并发控制,以避免数据冲突和并发更新问题。乐观锁是一种乐观的思想,它假设并发操作不会导致冲突,只......
  • “很内向,面试完不敢问 HR 结果”
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!现在这个时间段,想必大家都有面试经历了吧?有的面试结束后,就是无尽的等待时间。有的同学比较直接,向HR询问结果;而有的同学则在问不问之间来回摇摆。01为什么不敢问许多......