Redis面试问题一

news2024/11/15 11:46:12

Redis在面试中有很大的概率会问到,因此我们一定要学会回答此方面的问题。 Redis主要涉及到使用场景已经一些其他方面的问题。
在这里插入图片描述
下面是有可能涉及到的问题。
在这里插入图片描述

问题一:你最近的项目中那些场景用到了Redis呢?

需要结合简历项目上的业务进行具体说明。该问题一是验证你项目场景的真实性,二是作为深入发问的切入点。
若是回答有关缓存的内容,那么接下来有可能就会问你有关缓存三兄弟(穿透、击穿、雪崩)、双写一致、持久化、数据过期策略、数据淘汰策略方面的问题。
若回答有关分布式锁的内容,那么下面就有可能问你setnx、redisson等。
若回答有关消息队列、延迟队列方面内容,那么接下来就有可能对采用何种数据类型进行提问。
所以可根据回答内容对有关方面进行强化。

问题二:如果发生了缓存穿透、击穿、雪崩,该如何解决?

1.缓存穿透

Redis缓存穿透是一个在缓存系统中常见的问题,它指的是当缓存和数据库中都不存在某个查询的数据时,大量的请求会直接穿透缓存层,直接访问数据库,导致数据库的压力骤增,甚至可能引发系统崩溃或拒绝服务(DoS)攻击。以下是关于Redis缓存穿透的详细分析:
在这里插入图片描述

Redis缓存穿透的原因

数据不存在:查询的数据在数据库中本身就不存在,每次查询都会直接访问数据库。
恶意攻击:攻击者故意查询大量不存在的数据,以绕过缓存层,直接对数据库造成压力。
业务逻辑问题:由于代码缺陷或数据异常,导致系统频繁查询不存在的数据。

Redis缓存穿透的解决方案

缓存空对象
原理:当数据库中查询的数据为空时,将空结果也缓存起来,并设置较短的过期时间。这样,在缓存有效期内,对于相同的查询请求,可以直接从缓存中返回空结果,避免对数据库的再次查询。
应用场景:适用于查询结果可能为空,且对实时性要求不高的场景。
布隆过滤器(Bloom Filter)
原理:布隆过滤器主要由一个很长的二进制向量(位数组)和一系列随机映射函数(哈希函数)组成。当需要存储一个元素时,该元素通过多个哈希函数计算出一系列位置,并将这些位置在二进制向量中对应的位设置为1。当需要查询一个元素是否存在于集合中时,也通过同样的哈希函数计算出位置,并检查这些位置上的位是否都为1。如果都为1,则认为该元素可能存在于集合中;如果有任何一个位置上的位不为1,则可以确定该元素一定不存在于集合中。在查询缓存之前,使用布隆过滤器过滤掉可能不存在于数据库中的请求。
在这里插入图片描述
在这里插入图片描述
缺点
存在误判率:由于哈希函数的碰撞问题,布隆过滤器在判断元素是否存在时存在一定的误判率。即,有可能将不存在的元素误判为存在。
无法删除元素:布隆过滤器中的元素一旦被添加,其对应的位就会被设置为1,之后无法再将这些位恢复为0,因此布隆过滤器不支持元素的删除操作。
应用场景:适用于查询数据量大,且对误判率有一定容忍度的场景。

2.缓存击穿

**缓存击穿(Cache Breakdown)给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
在这里插入图片描述

解决方案:

互斥锁(Mutex Lock):在缓存失效后,第一个请求线程去查询数据库并重新构建缓存,其他线程则等待构建完成,然后直接从缓存中读取数据。这种方式可以减少对数据库的访问次数,但会增加线程等待时间。强一致性,但性能差
在这里插入图片描述

逻辑过期:逻辑过期是一种处理缓存数据失效时间的策略,与物理过期(即直接设置缓存项的过期时间)不同。在逻辑过期的方式中,缓存数据并不会在过期时被直接删除,而是会在缓存中保留该数据,但标记其为“过期”,表示该数据已经不再是最新的,或者已经不可用。高可用性,性能优,但不能保证数据绝对一致在这里插入图片描述

3.缓存雪崩

缓存雪崩是指在缓存系统中,大量缓存key在同一时间失效Redis服务宕机,导致大量请求直接到达数据库,造成后端系统的压力骤增,甚至引起系统崩溃的现象。

解决方案

1.给不同key的TTL添加随机值,设置随机的失效时间:为缓存对象设置稍微有差异的随机失效时间,避免大量缓存对象在同一时间失效。

2.利用Redis集群提高服务的可用性:如Redis哨兵模式或Redis集群部署方式,确保个别Redis节点下线时,整个缓存层依然可用。
哨兵模式实现原理
监控:哨兵节点定期向所有主节点和从节点发送PING命令,以检查它们的运行状态。
主观下线:如果哨兵节点在给定的时间内(通过sentinel down-after-milliseconds配置)未收到某个节点的有效响应,则将该节点标记为主观下线。
客观下线:当多个哨兵节点(达到配置的quorum值)都将某个主节点标记为主观下线时,该主节点被标记为客观下线。
故障转移:在主节点被标记为客观下线后,哨兵节点会进行故障转移操作,包括从所有健康的从节点中选举一个新的主节点,并将所有从节点切换到新的主节点上。
集群模式实现原理
数据分片:Redis Cluster将数据分为16384个槽(slot),每个节点可以处理0个或多个槽。
节点通信:节点之间通过Gossip协议进行通信,交换彼此的状态信息和槽的分配情况。
故障检测:节点之间会定期发送PING消息来检测对方是否在线。如果某个节点在一段时间内未收到其他节点的响应,则将该节点标记为疑似下线。当足够多的节点都认为某个节点已下线时,该节点被正式标记为已下线。
故障转移:当主节点下线时,集群中的从节点会进行选举,选举出一个新的主节点来接管原来的槽和数据。

3.给缓存业务添加降级限流策略
降级可作为系统的保底策略,适用于穿透、击穿、雪崩
自动降级:系统可以根据一些关键数据进行自动降级,如CPU使用率、内存占用率、响应时间等。当这些指标超过预设的阈值时,系统可以自动关闭一些非核心服务或功能,以释放资源,保护核心服务。
人工降级:在某些情况下,如系统升级、维护或遇到严重错误时,管理员可以手动触发降级操作,以减少对系统的影响。
流量控制:通过设置系统的最大并发数,当请求超过这个数值时,系统可以拒绝新的请求或将其放入队列等待处理。通过限制单位时间内的请求数量,如每秒请求数(QPS),来防止系统被过量的请求压垮。
流量整形:通过平滑突发请求,将请求流量整形为稳定的流量,以避免系统资源的突然波动。
排队与请求:当请求超过系统处理能力时,可以将请求放入队列中等待处理。同时,可以设置合理的等待时间和超时时间,以避免用户长时间等待或系统资源被无效占用。
4.给业务添加多级缓存:虽然这会增加Redis的存储空间需求,但可以避免大量缓存同时失效的问题。

助记

《缓存三兄弟》
穿透无中生有key,布隆过滤null隔离。
缓存击穿过期key,锁与非期解难题。
雪崩大量过期key,过期时间要随机。
面试必考三兄弟,可用限流来保底。

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

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

相关文章

Rust 通过 Deref trait 将智能指针当作常规引用处理

通过 Deref trait 将智能指针当作常规引用处理 实现 Deref trait 允许我们重载 解引用运算符(dereference operator)*(与乘法运算符或通配符相区别)。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待&#xff…

WPF+MvvmLight 项目入门完整教程(一)

WPF+MvvmLight入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架…

SQL Server 2019安装详细教程(图文详解,非常靠谱)

Microsoft SQL Server 是一种关系数据库管理系统 (RDBMS)。 应用程序和工具连接到 SQL Server 实例或数据库,并使用 Transact-SQL (T-SQL) 进行通信。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理任何 SQL 基础结构。 使用 SSMS 访问、…

AutoGen实战AI Agent开发

最近,关于 AI 智能体或AI代理(AI Agent)的讨论很多。受这种炒作的影响,我阅读了一些资料,偶然发现了 AutoGen,这是一个构建 AI 代理的很棒的库。但 AI 代理到底是什么?为什么它们很重要&#xf…

移动UI:表单美观易操作的十大准则,非常实用。

移动端表单设计需要遵循一些原则,以确保美观和易操作: 1.简洁明了: 在移动端表单设计中,要尽量简化内容,避免过多的文字和元素,保持简洁明了的布局,以便用户能够快速理解并填写表单。 2.响应式…

在 PostgreSQL 中如何优化涉及多个视图嵌套和函数调用的复杂查询?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中如何优化涉及多个视图嵌套和函数调用的复杂查询一、理解问题的本质二、优化的基本原则…

直播美颜工具开发教学:视频美颜SDK集成详解

本篇文章,笔者将详细介绍如何在直播应用中集成视频美颜SDK,让你的直播画面焕然一新。 一、什么是视频美颜SDK? 视频美颜SDK是一种软件开发工具包,提供了视频处理和图像增强功能。通过集成视频美颜SDK,开发者可以轻松…

【postgresql】角色(Role)

PostgreSQL 中,角色(Role)是一个重要的概念,用于管理数据库的访问权限和用户身份。角色可以被视为用户或组,具体取决于它们的配置方。 角色属性 角色可以具有多种属性: LOGIN:允许角色登录数据…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events (专栏目录) 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域,新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

2024.7.12单片机PWM

遇到了一个光标变成下划线的问题: Keil5光标变下划线,变回来的方法_keil5光标是下划线-CSDN博客 这里是用了输入捕获(IC:input capture),输出比较(OC:Output Compare)区别 学到这…

[Linux]添加sudoers

之前我们讲过sudo这个命令,它可以让我们普通用户进行短暂的提权,上回我们讲完了vim 本篇是个短篇,目的就是让我们之后的学习中可以使用sudo命令。 首先我们先登录root用户 ls /etc/sudoer 我们需要改的就是上面的这个文件 vim /etc/sudoers 我们用vim打开 把光标移动到这…

17-8 向量数据库之野望8 - 7 个主流向量数据库

​​​​​​ 在快速发展的人工智能 (AI)、机器学习 (ML) 和数据工程领域,对高效数据存储和检索系统的需求至关重要。矢量数据库已成为管理这些技术通常依赖的复杂高维数据的关键解决方案。在这里,我们探讨了每个 AI/ML/数据工程师都应该熟悉的七个矢量数据库,重点介绍了它们…

mysql-connector-java 8.0.33 反序列化漏洞

前言 经过与oracle官方沟通,在最新的mysql-connector-j 9.0.0里不存在这个问题,所以他们不认为这是个漏洞 不过确实,mysql-connector-java这个分支已经迁移到mysql-connector-j了,当时没注意,交的时候只注意了mysql-c…

全球DeepFake攻防挑战赛DataWhale AI 夏令营——图像赛道

全球DeepFake攻防挑战赛&DataWhale AI 夏令营——图像赛道 赛题背景 随着人工智能技术的迅猛发展,深度伪造技术(Deepfake)正成为数字世界中的一把双刃剑。这项技术不仅为创意内容的生成提供了新的可能性,同时也对数字安全构…

数学建模·模糊评价法

模糊评价法 一种解决评价问题或者得出最佳方案的方法 主观性仍比较强 具体定义 三集:因素集,评语集和权重集,通过模拟矩阵的处理得到最合理的评语 具体步骤 因素集 因素集的确定不难,难在对分级评价时,对因素集的分级…

MYSQL--第九次作业

MYSQL–第九次作业 1、安装redis,启动客户端、验证。 安装网址:Redis Released,找到适合自己电脑的redis版本后,下载并安装。 安装完后,打开cmd命令框: -- 启动客户端 C:\Windows\System32>redis-cl…

AV1 编码标准帧间预测技术概述

AV1 编码标准帧间预测 AV1(AOMedia Video1)是一种开源的视频编码格式,它在帧间预测技术上做出了显著的改进和扩展,以提供比现有标准更高的压缩效率和更好的视频质量。以下是AV1帧间预测技术的几个关键点: 参考帧扩展&a…

STM32(五):STM32指南者-按键控制灯开关实验

说明:源代码和教程可从野火处下载,本博客为了记录学习过程STM32(四):STM32指南者-跑马灯实验的基础上 一、采用轮询方式1、bsp_key.h2、bsp_key.c3、main.c 二、采用中断方式1、bsp_exti.h2、bsp_exti.c3、stm32f10x_i…

【动态规划1】斐波那契数列模型篇

文章目录 声明动态规划介绍1137.第N个泰波那契数题目描述分析代码 面试题 08.01. 三步问题题目描述分析代码 746.使用最小花费爬楼梯题目描述分析代码 91.解码⽅法题目描述分析代码 声明 本篇博客为动态规的基础篇,从零开始学习动态规划,如有错误&#…

14、Python之super star:一颗星、两颗星,满天都是小星星

引言 关于Python系列的文章,已经通过两篇文章,介绍了Python中关于函数的简单使用,包括为什么要使用函数,以及函数中带默认值参数的使用注意事项。 之后,岔开函数的主题,通过几篇番外篇,重点谈…