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

Redis 面试常见问答

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

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

作者:莫那 鲁道

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

Redis 面试常见问答_面试

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

如何解决呢?

Redis 面试常见问答_Redis缓存_02

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://blog.51cto.com/u_16151153/7539820

相关文章

  • Redis的五中数据类型以及应用场景
    1.string字符串在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist内部维护一个字节数组,在其内部分配了一定的空间.内存分配机制当字符串的长度小于1m的时候,每次扩容都是加倍空间当字符串长度超过1m的时候每次扩容只会扩张1m的空间字符串的最大长度......
  • Redis之Sentinel哨兵监控
    哨兵简介 1.redis提供了哨兵的命令,是一个独立的进程 2.哨兵通过发送命令给节点,通过redis节点响应达到监控多个redis实例的运行情况 3.当哨兵发现master宕机,会自动将从节点切换成主节点,并通知其他的从节点,修改配置文件切换主机 4.默认端口是26379哨兵的主要任务 1.......
  • Redis 不同插入方法的性能对比
    1.测试目的对比Redis不同插入方法(插入同时能设置过期时间)的性能区别。2.测试数据key:SMGP_value:JSON数据{ "spName":"100003", "protocol":"SMGP", "remoteAddress":"192.192.192.192:44192", "host":"192.192......
  • redis
    前言原文作者:KyleViolet文章链接:Redis入门|Kyle'sBlog(cyborg2077.github.io)版权声明:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.0许可协议。转载请注明来自Kyle'sBlog!本文章为在原文基础上,进行稍作修改的文章,版权声明如上。本文为瑞吉外卖项目的后续......
  • Redis 面试常见问答
    本文出自:https://thinkinjava.cn作者:莫那鲁道1.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓......
  • 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......