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道真题和解析
点赞 评论 收藏
分享
上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
27
132
分享

创作者周榜

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