[每周一更]-(第124期):模拟面试|缓存面试思路解析

在这里插入图片描述

文章目录

    • 31 为什么 Redis 不立刻删除已经过期的数据?
      • 1. Redis 是怎么删除过期 key 的?
      • 2. Redis 为什么不立刻删除已经过期的 key?
      • 3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?
      • 4. Redis 是如何执行定期删除的?
      • 5. 为什么 Redis 在定期删除的时候不一次性把所有的过期 key 都删除掉?
      • 6. 当你从 Redis 上查询数据的时候,有可能查询到过期的数据吗?
      • 7. 当 Redis 生成 RDB 文件的时候,会怎么处理过期的 key?
      • 8. 当 Redis 重写 AOF 文件的时候,会怎么处理过期的 key?
      • 9. Redis 定期删除的循环是不是执行得越频繁就越好?
      • 10. 如果设计一个本地缓存,你会怎么实现删除过期 key 的功能?
      • 11. 你是怎么确定过期时间的?过期时间太长会怎样,太短又会怎样?
    • 32 缓存淘汰策略:怎么淘汰缓存命中率才不会下降?
      • 1. 你知道什么是 LFU,什么是 LRU 吗?可不可以手写一个?
      • 2. 什么情况下使用 LFU,什么情况下使用 LRU?
      • 3. Redis 支持哪些淘汰策略?你们公司的 Redis 上的淘汰策略使用了哪个?为什么用这个?
      • 4. 你使用的本地缓存是如何控制内存使用量的?
      • 5. 你业务里面的缓存命中率有多高?还能不能进一步提高?怎么进一步提高?
      • 6. 假如说 A 和 B 两个业务共用一个 Redis,那么有办法控制 A 业务的 Redis 内存使用量吗?怎么控制?
      • 7. 现在我的业务里面有普通用户和 VIP 用户。现在我希望在缓存内存不足的时候,优先淘汰普通用户的数据,该怎么做?
    • 33 缓存模式:缓存模式能不能解决缓存一致性问题?
      • 1. 什么是 Cache Aside,它能不能解决数据一致性问题?
      • 2. 什么是 Read Through,它能不能解决数据一致性问题?
      • 3. 什么是 Write Through,它能不能解决数据一致性问题?
      • 4. 什么是 Write Back,它有什么缺点,能不能解决一致性问题?
      • 5. 什么是 Refresh Ahead,它能不能解决一致性问题?
      • 6. 什么是 Singleflight 模式?你用它解决过什么问题?
      • 7. 在具体的工作场景中,你是怎么更新数据的?会不会有数据不一致的问题?怎么解决?
      • 8. 什么是延迟双删,使用延迟双删能不能解决数据一致性问题?
      • 9. 你知道哪些缓存模式,用过哪些模式?
    • 34 缓存一致性问题:高并发服务如何保证缓存一致性?
      • 1. 为什么会有数据不一致的问题?
      • 2. 你在使用缓存的时候怎么解决数据不一致的问题?
      • 3. 当你的数据不一致的时候,你多久能够发现?
      • 4. 如果你使用了本地缓存和 Redis,那么更新数据的时候你怎么更新?
      • 5. 使用分布式锁能不能解决数据一致性问题,有什么缺点?
      • 6. 你能保证更新数据库和更新缓存同时成功吗?如果不能,你怎么解决?
      • 7. 你有什么方法可以解决并发更新导致的数据不一致性问题?
    • 35 缓存问题:怎么解决缓存穿透、击穿和雪崩问题?
      • 1. 什么是缓存穿透、击穿和雪崩?
      • 2. 你平时遇到过缓存穿透、击穿和雪崩吗?什么原因引起的?最终是怎么解决的?
      • 3. 你还遇到过什么跟缓存有关的事故?最终都是怎么解决的?
      • 4. 在你的系统里面,如果 Redis 崩溃了会发生什么?
      • 5. 怎么在 Redis 崩溃之后保护好数据库?
    • 36 Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
      • 1. 操作系统中的上下文切换有什么开销?
      • 2. Redis 真的是单线程的吗?
      • 3. Redis 为什么后面又引入了多线程?
      • 4. Redis 后面引入的多线程模型是怎么运作的?相比原本的单线程模型有什么改进?
      • 5. 同样是缓存,为什么 Memcached 使用了多线程?
      • 6. 什么是 epoll?和 poll、select 比起来,有什么优势?
      • 7. 什么是 Reactor 模式?
      • 8. 为什么 Redis 的性能那么好?
      • 9. 你可以说说 Redis 的 IO 模型吗?
      • 10. 为什么 Redis 可以用单线程,但是 Kafka 之类的中间件却不能使用单线程呢?
    • 37 分布式锁:如何保证Redis分布式锁的高可用和高性能?
      • 1. 什么是分布式锁?你用过分布式锁吗?
      • 2. 你使用的分布式锁性能如何,可以优化吗?
      • 3. 怎么用 Redis 来实现一个分布式锁?
      • 4. 怎么确定分布式锁的过期时间?
      • 5. 如果分布式锁过期了,但是业务还没有执行完毕,怎么办?
      • 6. 加锁的时候得到了超时响应,怎么办?
      • 7. 加锁的时候如果锁被人持有了,这时候怎么办?
      • 8. 分布式锁为什么要续约?续约失败了怎么办?如果重试一直都失败,怎么办?
      • 9. 怎么减少分布式锁竞争?
      • 10. 你知道 redlock 是什么吗?
    • 38 缓存综合应用:怎么用缓存来提高整个应用的性能?
      • 1. 你是如何利用缓存来提高系统性能的?
      • 2. 当你的缓存崩溃了的时候,你的系统会怎么样?
      • 3. 你们公司的 Redis 是如何部署的,性能怎么样?
      • 4. 假如说有一个服务 A 要调用服务 B,那么能不能让 A 把 B 的结果缓存下来,这样下次就不用调用了?这种做法有什么优缺点?
        • 优点:
        • 缺点:
      • 5. 为什么要做缓存预加载,怎么做预加载?
        • 原因:
        • 做法:

31 为什么 Redis 不立刻删除已经过期的数据?

  1. Redis 是怎么删除过期 key 的?
  2. Redis 为什么不立刻删除已经过期的 key?
  3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?
  4. Redis 是如何执行定期删除的?
  5. 为什么 Redis 在定期删除的时候不一次性把所有的过期 key 都删除掉?
  6. 当你从 Redis 上查询数据的时候,有可能查询到过期的数据吗?
  7. 当 Redis 生成 RDB 文件的时候,会怎么处理过期的 key?
  8. 当 Redis 重写 AOF 文件的时候,会怎么处理过期的 key?
  9. Redis 定期删除的循环是不是执行得越频繁就越好?
  10. 如果设计一个本地缓存,你会怎么实现删除过期 key 的功能?
  11. 你是怎么确定过期时间的?过期时间太长会怎样,太短又会怎样?

1. Redis 是怎么删除过期 key 的?

Redis 使用惰性删除(lazy deletion)和定期删除(periodic deletion)两种策略来删除过期的 key。

  • 惰性删除:当客户端尝试访问某个 key 时,Redis 会检查该 key 是否过期,如果已经过期,则在查询时删除它。
  • 定期删除:Redis 会周期性地扫描一部分存储的数据,删除其中已经过期的 key。

2. Redis 为什么不立刻删除已经过期的 key?

立刻删除过期的 key 会导致性能开销大,影响 Redis 的响应速度。因为 Redis 是高性能的内存数据库,频繁地执行删除操作可能会造成阻塞,从而影响其他请求的处理。因此,Redis 采用惰性删除和定期删除的策略,以平衡性能与内存的利用。

3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?

如果每个 key 都启动一个定时器,Redis 的内存和 CPU 开销将会非常大。Redis 可能会有成千上万的 key,创建和维护大量定时器不仅复杂,还会影响 Redis 的性能。因此,Redis 选择了在查询时检测过期(惰性删除)和周期性扫描一部分 key(定期删除)来管理过期数据。

4. Redis 是如何执行定期删除的?

Redis 会在设定的时间间隔内(默认 100ms)随机抽取一部分设置了过期时间的 key 进行检查,并删除已过期的 key。Redis 并不会一次性遍历所有的 key,而是通过抽样的方式控制开销,以保证数据库的稳定性和高性能。

5. 为什么 Redis 在定期删除的时候不一次性把所有的过期 key 都删除掉?

如果一次性删除所有过期的 key 可能会引起系统短暂的停顿,导致响应变慢,尤其在有大量过期 key 的情况下会引发性能瓶颈。因此,Redis 采取分步的方式,避免删除操作对性能的集中影响。

6. 当你从 Redis 上查询数据的时候,有可能查询到过期的数据吗?

可能会。在使用惰性删除策略时,Redis 只有在访问一个 key 时才会检查其是否过期,因此存在查询到已经过期但尚未被删除的 key 的可能性。

7. 当 Redis 生成 RDB 文件的时候,会怎么处理过期的 key?

在生成 RDB 文件时,Redis 会检查并跳过已过期的 key。只有未过期的 key 才会被写入到 RDB 文件中,以保证备份文件的有效性和数据的准确性。

8. 当 Redis 重写 AOF 文件的时候,会怎么处理过期的 key?

在 AOF 重写过程中,Redis 会跳过已过期的 key,确保重写后的 AOF 文件只包含有效数据。因此,在 AOF 文件重写完成后,可以减少文件体积,提升持久化效率。

9. Redis 定期删除的循环是不是执行得越频繁就越好?

不一定。定期删除的循环过于频繁会占用过多的 CPU 资源,影响正常的请求处理。因此需要合理地设置频率,找到删除操作与性能之间的平衡点。一般情况下,Redis 的默认设置已经比较合理。

10. 如果设计一个本地缓存,你会怎么实现删除过期 key 的功能?

可以考虑与 Redis 类似的策略,结合惰性删除和定期删除:

  • 惰性删除:在访问缓存数据时检查是否过期,如果过期则删除。
  • 定期删除:设定一个定时任务,周期性地随机检查一部分缓存数据并删除过期的 key。

11. 你是怎么确定过期时间的?过期时间太长会怎样,太短又会怎样?

过期时间的确定取决于业务需求:

  • 如果过期时间太长,缓存会占用更多的内存,但可以减少缓存失效导致的数据库访问压力。
  • 如果过期时间太短,虽然节省了内存,但可能会频繁访问后端数据库,增加负载。因此,需要权衡存储资源和访问效率来合理设定。

32 缓存淘汰策略:怎么淘汰缓存命中率才不会下降?

  1. 你知道什么是 LFU,什么是 LRU 吗?可不可以手写一个?
  2. 什么情况下使用 LFU,什么情况下使用 LRU?
  3. Redis 支持哪些淘汰策略?你们公司的 Redis 上的淘汰策略使用了哪个?为什么用这个?
  4. 你使用的本地缓存是如何控制内存使用量的?
  5. 你业务里面的缓存命中率有多高?还能不能进一步提高?怎么进一步提高?
  6. 假如说 A 和 B 两个业务共用一个 Redis,那么有办法控制 A 业务的 Redis 内存使用量吗?怎么控制?
  7. 现在我的业务里面有普通用户和 VIP 用户。现在我希望在缓存内存不足的时候,优先淘汰普通用户的数据,该怎么做?

1. 你知道什么是 LFU,什么是 LRU 吗?可不可以手写一个?

  • LFU(Least Frequently Used):最少使用策略。缓存会优先淘汰访问频率最低的数据,即被访问次数最少的元素。
  • LRU(Least Recently Used):最近最少使用策略。优先淘汰一段时间内没有被访问的数据,即最近最少使用的元素。

示例代码展示一个简单的 LRU 缓存,可以使用 Python 的 OrderedDict 实现:

python复制代码from collections import OrderedDictclass LRUCache:def __init__(self, capacity: int):self.cache = OrderedDict()self.capacity = capacitydef get(self, key: int) -> int:if key not in self.cache:return -1self.cache.move_to_end(key)  # 将访问的 key 移到末尾return self.cache[key]def put(self, key: int, value: int) -> None:if key in self.cache:self.cache.move_to_end(key)self.cache[key] = valueif len(self.cache) > self.capacity:self.cache.popitem(last=False)  # 删除最旧的# 使用示例
cache = LRUCache(2)
cache.put(1, 1)
cache.put(2, 2)
print

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

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

相关文章

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始,到0x90200结束

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中,经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术,可以帮助我们在不同平台或环境下编写不同的代码,以适应不同的平…

模糊控制系统的设计(取材bilibili_蓝天的季洁)

模糊控制原理和传统控制原理,在框图上的区别实际上只在控制器方面存在差异,将传统的控制器改为了模糊控制器(fuzzy controller)。 通过举例说明,将原有的[0,100]的参数通过隶属函数规则,(类似于…

pytest日志总结

pytest日志分为两类: 一、终端(控制台)打印的日志 1、指定-s,脚本中print打印出的信息会显示在终端; 2、pytest打印的summary信息,这部分是pytest 的默认输出(例如测试结果PASSED, FAILED, S…

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中, A 和 …

深入探究蓝牙节能技术:SNIFF与HOLD模式

目录 一、概述 1.1. Sniff Mode(嗅探模式/呼吸模式) 1.1.1.定义与目的 1.1.2 工作原理 1.1.3 进入与退出 1.2. Hold Mode(保持模式) 1.2.1. 定义与目的 1.2.2. 工作原理 1.2.3. 进入 1.2.4. 通知机制 二、Sniff mode&a…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…

电子电气架构 ---漫谈车载网关

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

@Autowired与构造器注入区别,为什么spring推荐使用构造注入而不是Autowired?

目录 1.简介 2.了解两种注入方式的全过程 2.1 Autowired字段注入 2.2 构造函数注入 3.使用autowired注解注入有以下问题 3.1空指针异常 3.2测试不友好 4.使用Lombok去简化构造函数注入的臃肿代码 5.小结 5.1注解注入 5.2构造函数注入 1.简介 使用Spring开发时&#…

优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本

Transformer 架构由 Vaswani 等人在 2017 年发表的里程碑式论文《Attention Is All You Need》中首次提出,如今已被广泛认为是过去十年间最具开创性的科学突破之一。注意力机制是 Transformer 的核心创新,它为人工智能模型提供了一种全新的方法&#xff…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表,录入的日期格式很混乱,有些看着差不多,但实际多一个空格少一个字符很难发现,希望的理想格式是 1980-01-01,10位,即:“YYYY-mm-dd”,实际上数据表中这样的格式都有 19…

医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22

小罗碎碎念 今天给大家推荐一本入门书籍。 这本书由Uday Kamath、Kenneth L. Graham和Wael Emara撰写,深入探讨了Transformer模型在机器学习领域的应用,特别是自然语言处理(NLP)。 原文pdf已经上传至知识星球的【入门书籍】专栏&…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程,提供一些解决思路 需求背景 公司有一个IM项目,对外暴露了两个端口8081和8082,8081是springboot启动使用的端口,对外提供一些http接口…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证: 1.防爆外壳设计:EX系列电机采用强大的防爆外壳,设计遵循严格的防爆标准,能够承受内部可能发生的爆炸而不破损,利用间隙切断原理,防…

虚拟形象+动作捕捉:解锁品牌N种营销玩法

近年来,随着Z世代年轻人对于二次元文化的热爱,各种二次元内容频频出圈。为了吸引年轻观众的注意,虚拟IP形象成为了品牌营销的“新宠”与“利器”为品牌踏入元宇宙蓝海提供了关键的切入点。在此背景下虚拟形象动作捕捉技术的组合应用方式正成为…

空间计算、物理计算、实时仿真与创造拥有「自主行为」的小狗 | 播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目,关注行业发展变革、开发者职涯发展、技术突破以及创业创新,由开发者来分享开发者眼中的工作与生活。 虚拟世界与现实世界的界限逐渐模糊,已然成为不争的事实。但究竟哪些曾经的幻想已然…

影响电阻可靠性的因素

一、影响电阻可靠性的因素: 影响电阻可靠性的因素有温度系数、额定功率,最大工作电压、固有噪声和电压系数 (一)温度系数 电阻的温度系数表示当温度改变1摄氏度时,电阻阻值的相对变化,单位为ppm/C.电阻温度…

JAVA后端如何调用百度的身份证识别API

大家好,我是 程序员码递夫 。 今天给大家分享的是 JAVA后台如何调用百度的身份证识别API。 1、前言 我们做APP开发时常遇到 身份证认证或资质认证的 需求, 通过上传身份证照片是个常用的操作, 后台对上传的身份证照信息进行识别&#xff0…

Go语言进阶依赖管理

1. Go语言进阶 1.1 Goroutine package mainimport ("fmt""time" )func hello(i int) {println("hello goroutine : " fmt.Sprint(i)) }func main() {for i : 0; i < 5; i {go func(j int) { hello(j) }(i) // 启动一个新的 goroutine&…