Redis简历话术

本专栏只总结最重要的八股,简历对应的

简历话术:

Redis:熟悉Redis基本使⽤、常⻅缓存读写策略、⽣产问题及持久化、内存管理、集群、分布式锁

1.常见缓存读写策略

1.1 Cache Aside(旁路缓存)策略

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

如果读取的数据命中了缓存,则直接返回数据 如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存,并且返回给用户。

1.2 Read/Write Through(读穿 / 写穿)策略

应用程序的“写”请求,必须直接发送到缓存组件。缓存组件负责同步: 缓存组件(或一个智能的客户端库)接收到写请求后,会原子性地、同步地执行以下两个操作:a. 更新数据库: 将新的数据写入底层数据库。b. 更新缓存: 将新的数据写入自身的缓存。 应用要直接写缓存,但缓存系统会保证数据库也随之更新。 这正是 Write-Through 模式得名的原因——写请求“穿透”缓存,直达数据库。

应用直接读缓存。缓存命中则返回;未命中则由缓存组件负责从数据库加载并写入自身,然后返回。

特性 读穿 / 写穿(封装) 旁路缓存(应用自己处理)
核心哲学 缓存是数据主入口,对应用透明,是一种封装 缓存是数据库的辅助旁路,应用==显式管理==
读流程 缓存未命中时,缓存自身从DB加载 应用 -> 缓存。 存未命中时,应用从DB加载并回填
写流程 缓存自身同步更新DB 应用 -> 数据库,然后应用使缓存失效
性能 写操作延迟较高(需同步写DB) 写操作延迟较低(因为可以做优化,比如合并多个缓存失效操作,异步更新DB删除缓存)
适用场景 一致性要求高、希望应用逻辑简单的场景 需要最高性能、能接受短暂不一致的通用场景

1.3 Write Back(写回)策略

只更新缓存,将缓存数据设置为脏的,不更新数据库。对于数据库,批量异步更新

如果读取的数据命中了缓存,则直接返回数据 如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存(标记干净),并且返回给用户。

2.Redis生产问题和解决方案(缓存雪崩 缓存穿透 缓存击穿(热点key问题))

这些问题都是害怕数据库出问题,而不是说缓存本身。数据库和缓存性能差距巨大,QPS相差1-2个数量级。

  • 缓存穿透是查询数据库中不存在的数据,缓存空对象即使查询不到,也缓存一个空值(如""或null)并设置一个较短的过期时间。布隆过滤器在缓存之前加一层布隆过滤器,用于快速判断某个key是否一定不存在于数据库中。如果布隆过滤器说不存在,则直接返回,避免查询数据库。
  • 缓存雪崩是大量的缓存数据同时过期失效(错开过期时间),或者缓存服务整体宕机(高可用集群),导致所有原本应该访问这些缓存的请求,瞬间都涌向了后端数据库(如MySQL)。
  • 缓存击穿(热点Key问题) 一个热点key在缓存过期的瞬间,大量请求同时涌入,击穿缓存,直接访问数据库,互斥锁(大量打到数据库的请求让第一个拿到锁,其他的拿不到锁就休眠不去打到数据库重新尝试拿缓存,拿不到缓存就尝试拿锁,拿不到锁就再等会继续,直到第一个写入缓存。当然也要释放锁),热点数据永不过期(用逻辑过期),

3. 持久化机制

3.1 AOF持久化

AOF的写入分为两个步骤:

命令追加(Append to Buffer):

主线程执行完写命令后,会将该命令以协议格式追加到内存中的AOF缓冲区(aof_buf)。 这个操作是在主线程中完成的!

同步磁盘(Sync to Disk):

根据 appendfsync 的配置,决定如何将缓冲区中的数据写入并同步到磁盘的AOF文件中。fsync()是一个系统调用,能立马将数据同步到硬盘,而不是像write一样先到内核缓冲区。 这就是 everysec, always, no 策略发挥作用的地方。

alt

no策略意味着把何时写入磁盘交给了操作系统。

AOF重写:Redis 为了解决 AOF 文件膨胀问题

  • 不读取旧 AOF 文件,而是直接读取当前内存中的数据库状态,生成等价的最小写命令集(例如将多个操作合并为最终结果的 SET/HSET 等)
  • 重写过程由子进程(AOF重写时,要读取所有缓存的键值对,所以要耗时,故开子进程,写入 AOF 日志的操作是在主进程完成的,因为它写入的内容不多一般不太影响命令的操作。)在后台执行,避免阻塞主进程处理请求
  • 完成后用新 AOF 文件原子替换旧文件,并继续追加后续命令。

存在问题,如果子进程生成AOF文件的时候,一部分处理过的生成了对应AOF日志的键值又被修改了。最后就会丢失这个修改。 如何解决? 利用写时复制”和“AOF重写缓冲区本文只有最高频主要,具体点击可看

AOF记录的是操作命令。如果要做恢复。得有执行命令的过程。 如果用RDB,那么直接把他读入内存就可以。

3.2 RDB快照

它会在指定的时间间隔内,将内存中的数据以二进制文件的形式保存到硬盘。 恢复速度快,但是可能丢失数据

3.3 RDB和AOF合体

混合使用AOF日志和内存快照(混合持久化) 混合持久化工作在AOF日志重写过程,也就是说原来的AOF重写,子进程写入的是AOF日志,而现在写入的是RDB快照的全量数据,之后再写入AOF格式的增量数据(将重写缓冲区中的内容写入)

兼有两者优点

4. 内存管理

4.1 过期删除(惰性删除+定期删除)

  • 惰性:客户端访问键 → Redis检查过期字典 → 如果过期 → 立即删除 → 返回空值
  • 定期:定时任务启动 → 随机抽样键 → 检查过期 → 删除过期键 → 控制执行时间(避免循环过度出现线程卡死)→ 判断本轮过期key比例→ 如果超过则返回随机抽样那个步骤

4.2 内存淘汰

当超过配置的maxmemory,会触发内存淘汰机制

不进行数据淘汰(Redis3.0后默认)

当超过maxmemory,直接返回错误,不再提供服务。

进行数据淘汰(可配置策略)

在设置了过期时间的数据中进行淘汰 volatile

  • volatile-random - 随机淘汰
  • volatile-ttl - 优先淘汰最早过期
  • volatile-lru - 淘汰最久未使用
  • volatile-lfu - 淘汰最少使用

在所有数据范围内淘汰 allkeys

  • allkeys-random 随机
  • allkeys-lru 最久未使用
  • allkeys-lfu 最少使用

5. 集群(实现高可用)

5.1 主从复制

一个主节点负责写,多个从节点负责读。

5.2 哨兵模式

在主从复制的基础上,增加了哨兵进程来监控主从节点的健康状态。当主节点宕机时,哨兵能自动将一个从节点提升为新的主节点,并让其他从节点指向新的主节点。

5.3 切片集群模式(cluster集群)

有主从无哨兵分片 Redis Cluster是从Redis3.0版本开始,官方提供的一种实现切片集群的方案。

高可用 (High Availability): 每个主节点都应至少有一个 从节点 (Slave)。(一个集群最少需要 3 个主节点 才能保证高可用(故障转移需要多数派同意)。当主节点发生故障时,其从节点会自动晋升为新的主节点,继续提供服务。

Redis 分片集群(Cluster)模式中,没有也不需要独立的哨兵(Sentinel)进程。Redis切片集群,持续地与其他节点进行通信,互相监控健康状态。当需要判断一个主节点是否失效时,集群中的其他主节点会共同参与投票。

分片 (Sharding): 数据被自动分割到多个 主节点 (Master) 上,每个主节点负责整个集群数据的一个子集。 哈希槽 (Hash Slot): 集群共有 16384 个槽(固定使用16384(16K)个哈希槽(Hash Slot),并且这个数字是硬编码的)。每个键通过 CRC16 校验后对 16384 取模来决定放入哪个槽。槽再被分配到具体的某个主节点上。 增减节点时,只需在节点间迁移槽位,无需对所有数据重新哈希

哈希槽怎么映射到具体的主节点中?

  • 平均分配。默认均分
  • 手动分配

6. 分布式锁

具体参见blog

alt

#简历#
简历技能对应的核心八股 文章被收录于专栏

针对面试,整理简历上写的每行技术点+对应完整话术和扩展点,快速速成

全部评论
值得进一步优化
点赞 回复 分享
发布于 04-13 18:38 江苏
缓存策略对比
点赞 回复 分享
发布于 04-12 12:39 吉林
感谢分享,有学到了,太赞的分享了
点赞 回复 分享
发布于 04-12 11:53 陕西
猫熊好厉害
点赞 回复 分享
发布于 04-09 00:15 湖南
楼主你是工作了多久了
点赞 回复 分享
发布于 04-08 21:55 陕西
猫熊哥牛逼
点赞 回复 分享
发布于 04-08 12:50 江苏
缓存策略对比
点赞 回复 分享
发布于 04-07 11:52 北京
订阅收费吗?
点赞 回复 分享
发布于 04-05 17:22 重庆

相关推荐

04-06 03:30
门头沟学院 Java
努力拥抱AI中…1. 选一个项目,具体介绍一下都有哪些模块,以及你在里面遇到的一些问题,解决了哪些。2. 这个子Agent是怎么交互的呢?它交互协议是什么?3. 这个助手,它是一个固定的工作流吗?主Agent会判断调哪些子Agent吗?4. 这个控制你是怎么实现的呢?怎么让AI Agent动态地去识别?5. 这个子Agent是串行的还是并行的?6. 这个Agent是怎么去让它实现搜索或者查询的?是调的一些公开接口吗?7. 这个ReAct范式你是怎么理解的,以及怎么实现的?8. 针对你这个项目能举一个具体的例子吗?你是怎么做的?9. 这个循环3次是每次必须要跑3次吗?他会提前退出吗?10. 这个MCP协议是干嘛的?这个怎么理解呢?11. 你实现的这个助手里面不是有长短记忆吗?这个短期记忆你能介绍一下吗?12. 你平时会用AI coding嘛?13. 除了编码阶段,其他节点比如架构设计、接口设计有尝试吗?14. 现在你们用AI去编码的话,AI写完之后你会去通读一遍,还是说只要测试没问题就不看也行?15. 如果我想让AI每次编码的时候都遵循一定的规则,比如抛异常要打日志,或者方法不能超过500行,要怎么实现呢?16. Skill和MCP以及Rule的区别是什么?17. Skill怎么去控制我可以加载哪些呢?是Skill本身具备这个能力,还是使用Skill的工具具备这个能力呢?18. 最近比较火的OpenClaw了解过吗?你觉得它是一个什么样的东西呢?它怎么能做到是个通用的Agent呢?19. 你觉得Claude模型和Codex模型这两个模型,你觉得哪一个好?20. Java里面那个接口和抽象类,这两者的区别是什么?21. Redis对于那种到了过期时间的数据,他会怎么去清理?清理机制是什么样的?22. 如果我想让它过期之后就立马删除,而不是等内存满的时候再删除,你能想想一些方案吗?23. 我是要扫描所有的Key吗?以及多长时间去扫描一次?你觉得应该怎么设计呢?
牛客喵🐱:○这周这家公司好多人都在面,春招专题里还能看到其他公司的最新招聘动态和面经,快去看看👉 https://www.nowcoder.com/link/chunzhaoji2610
查看23道真题和解析
点赞 评论 收藏
分享
04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
27
131
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务