当前位置: 首页 > news >正文

Redis面试题

目录

缓存穿透:

解决办法:

1.缓存空值:

2.布隆过滤器:

缓存预热:

误判的情况:

缓存击穿:

互斥锁和逻辑过期 

互斥锁:

逻辑过期:

缓存雪崩: 

双写一致:

延迟双删

先删除缓存,后删除数据库:

先删除缓数据库,后删除缓存:

小结:

读写锁:

异步通知:

基于MQ的异步通知:

基于Canal的异步通知:

总结:

数据过期策略:

惰性删除:

定期删除:

slow模式:

fast模式:

数据淘汰策略

redis的其他面试问题:


前言

在当今数字化高速发展的时代,数据的存储与处理效率成为众多企业关注的核心要点。Redis,作为一款高性能的键值对存储数据库,凭借其丰富的数据结构、卓越的读写性能以及出色的可扩展性,在互联网技术栈中占据着举足轻重的地位。无论是小型创业公司,还是大型互联网巨头,都离不开 Redis 的助力。当我们渴望踏入相关技术岗位,深入掌握 Redis 面试题就成为了迈向成功的关键一步。它不仅能帮助我们梳理知识体系,更能让我们在面试中从容应对,展现专业风采。现在,就让我们一同深入探索 Redis 面试题的世界。

缓存穿透:

大量的恶意请求去访问你数据库里不存在的数据,导致请求不走缓存,直接打到数据库,造成数据库压力过大甚至崩溃。

解决办法:

1.缓存空值:

每次的请求发现数据库不存在的数据,也会对他进行缓存(key:1 value:null)。因为可能会缓存大量的空值,所以占用的内存会很高。而且可能缓存里存了空值,数据库更新有数据了,这就会导致缓存不一致

2.布隆过滤器:

大量请求过来,先去查布隆过滤器,布隆过滤器要是没有,那就直接返回,缓存都不走。

实现:

缓存预热:

我们把热点数据在放进redis同时也放进布隆过滤器。

误判的情况:

id等于3的数据它不存在,但是他经过哈希函数算出来的位图下标都为1,会判定它存在

缓存击穿:

互斥锁和逻辑过期 

互斥锁:

线程1到查询这个key,它过期了,他会加一把互斥锁,然后重建数据库。这个时候如果线程2来访问,那就会让他等待,并且他还会隔一段时间就来请求

逻辑过期:

线程1到查询这个key,它过期了,他会加一把互斥锁。然后他会新开一个线程2来去重建数据库,写入缓存,重建过期时间,这个时候线程1会返回过期数据,线程2释放锁,这个时候注意:新来的线程(线程3)他如果来的时间是线程2释放锁之前,他会获取锁失败返回旧数据,线程2释放锁之后,那么它(线程4)就能获取最新数据


缓存雪崩: 

如果是这个key同时过期,我们可以给这些key设随机过期时间

如果是redis宕机了,那就可以用哨兵模式集群模式

这里可以参考:我写的redis主从模式和集群模式

双写一致:

延迟双删

写操作时:延迟双删

这个时候到底是先删库还是删缓存呢?

其实都有弊端:

先删除缓存,后删除数据库:

缓存10 ,库10

线程1:执行完了:缓:null,库10

线程2:缓:10,库,10

线程1:缓:10,库:20(不一致)

先删除缓数据库,后删除缓存:

起始条件:缓存:null,数据库10

线程1:缓存:null,数据库10

线程2:缓存:null,数据库20

线程1:缓存:10,数据库20(不一致)

小结:

两种删除方法都会导致脏数据的出现导致不一致

所以这个时候就要用延时双删了,修改完数据库后延时再删一次缓存,保证数据的一致性,但是延时多少,我们就不知道到底是多少比较好,所以这个延时双删的策略也有脏数据的产生

那延时双删不能保证强一致性,那有以下办法来保证

读写锁:

业务场景一般是读多写少,所以我们可以加一个共享锁(读锁)和排他锁(写锁)

读数据时:其他线程可以共享读操作

写数据时:加锁后阻塞其他线程的读写操作。

因为是读多写少,读的时候加读锁,其他线程也不干扰,在写操作时加了写锁,能保证数据的一致性,这样对比分布式锁(读和写都添加了锁)肯定性能要更高。

异步通知:

基于MQ的异步通知:

修改数据时,会发送一条消息给MQ,缓存服务要监听这个MQ,一旦有消息,那就更新redis。

这个虽然会有延迟性(发消息要时间),但是它可以保证最终的一致性,他是依靠于MQ的稳定性。

基于Canal的异步通知:

数据库发生变化后,数据库更新BINLOG二进制日志,Canal监听到消息后,通知redis。

优点:异步通知对代码没有侵入

总结:

数据过期策略:

假如redis里的数据过期了,会立即删除吗?

我们有两种不同的删除策略:惰性删除定期删除

惰性删除:

当我们的线程访问数据时看他有没有过期,过期了就删掉。这种策略很明显,对CPU很友好,但是对内存不太友好,因为可能会存在大量过期的Key不能被删掉。

定期删除:

每隔一段时间,我们就对一部分Key做一些检查,检查他们是否过期,删除过期的Key。当然了,会把所有的Key都遍历一遍。

定期删除又分为两个模式:Slow和Fast模式

slow模式:

频率为10HZ,每次不超过25ms,可以通过修改配置文件来调整参数

fast模式:

Fast模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms。

Redis所用的是惰性删除和定期删除混合的策略。


数据淘汰策略

重点是:LRU和LFU解释清楚,分别是时间和频率。

redis的其他面试问题:

结尾

通过对一系列 Redis 面试题的剖析与探讨,我们对 Redis 的原理、应用场景、性能优化等方面有了更为透彻的理解。这些知识不仅是面试场上的有力武器,更是我们在实际开发工作中优化系统、提升效率的宝贵财富。面试是检验知识储备与技术能力的关卡,但学习 Redis 远不止于此。技术的浪潮永不停歇,Redis 也在持续演进,我们应保持求知若渴的态度,不断探索新特性、新用法,在技术之路上稳步前行,以更好地适应不断变化的开发需求,为项目和团队创造更大价值。

http://www.xdnf.cn/news/360883.html

相关文章:

  • 力扣26——删除有序数组中的重复项
  • 【推荐笔记工具】思源笔记 - 隐私优先的个人知识管理系统,支持 Markdown 排版、块级引用和双向链接
  • Qt 的原理及使用(1)——qt的背景及安装
  • 在另一个省发布抖音作品,IP属地会随之变化吗?
  • 【数据结构】1. 时间/空间复杂度
  • 2025数维杯数学建模A题完整论文模型代码:空中芭蕾
  • SpringBoot统一功能处理
  • 13.原生测试框架Unittest解决用例组织问题 与测试套件的使用
  • H5 移动端适配最佳实践落地指南。
  • 影楼精修-牙齿美型修复算法解析
  • 数据类型:List
  • robotframe启动ride.py
  • C++ Dll创建与调用 查看dll函数 MFC 单对话框应用程序(EXE 工程)改为 DLL 工程
  • C#学习——继承、封装、多态
  • 安科瑞DJSF1352-RN直流电能表的技术特点与应用
  • ZYNQ笔记(十九):VDMA VGA 输出分辨率可调
  • 各类音频放大器电路原理简析
  • MSF 生成不同的木马 msfvenom 框架命令
  • html object标签介绍(用于嵌入外部资源通用标签)(已不推荐使用deprecated,建议使用img、video、audio标签)
  • Nx与Monorepo
  • 【软件测试】测试用例的概念与常见测试的模型
  • Django ORM: values() 和 annotate() 方法详解
  • 2025-05-09 提示学习概念
  • Edu教育邮箱申请2025年5月
  • 【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决
  • lambda 表达式
  • 摄像头模组高像素模组
  • AI模型蒸馏技术在微控制器上的内存占用与精度平衡实践
  • Java中的反射
  • C++23 中的 views::chunk:深入探索与应用