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

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

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

全部评论
缓存策略对比
点赞 回复 分享
发布于 今天 11:52 北京
订阅收费吗?
点赞 回复 分享
发布于 04-05 17:22 重庆

相关推荐

牛客62533758...:华为不卡双非,而是卡院校hhhh
点赞 评论 收藏
分享
这次面试是压力面,一点答不上来,可能是我一个月都在看go,边看边面,cpp的八股忘球了,除了cpp这块,别的也算基础吧,一直够不到他的点上,再或许是因为面试的前一分钟收到了携程的英语测评,哈哈哈,这种爽和紧张交加的感觉谁懂),感觉是对着effective cpp这本书问的,打算看看里面的笔记。已挂(很多都没回答好,面试官压力感太强了)深度八股盛宴平时都用cpp吗?(这里如果说用go and cpp也不至于死这么惨)1.说说static关键字的作用(这里没对比c和cpp,导致的追问环节一  局部static变量:生命周期从第一次执行到程序结束,只初始化一次,函数退出不销毁二 全局static变量/函数:限制作用域在当前文件(不暴露给其他编译单元)三 类static成员变量:被所有类对象共享,类外初始化四 类static函数:不依赖具体对象,只能访问static成员)2.cpp的闭包(没听过,说只看过go的闭包,后面说想问lambda,可以捕获外部变量(值或者引用),生成一个匿名函数对象,捕获方式有[=] [&] [this] [a,&b])3.cpp的lambda了解吗?说说lambada和普通函数的区别(接2问的,就说在算法题的cmp函数里面用过,使语法简洁,可读性高。“对比一下go的闭包是语法级别的,cpp闭包本质是编译器生成的仿函数”Lambda是一个带状态的函数对象,编译器为他生成一个匿名类型,可以捕获状态,可以内联,普通函数是无状态的,而且拥有唯一的函数签名,他们定义位置也不一样(普通是全局和类内,lambda是局部和全局))4.说说extern C关键字?(说成extern,不知道extern C)extern "C" {    #include "some_c_lib.h"}用于c/cpp混合编程,保证符号可识别。---此刻脑子已经麻了,太紧张了5.没了解过extern c,就说说cpp左值和右值的区别(这里把右值引用&&说成右值改左,悲,std::move左改右没说错。”左:有内存地址,可多次使用、可出现在赋值号左边,右:临时的、无地址、通常是字面量或函数返回的临时对象,判断标准就是是否能用&取址“)6.说说完美转发(这里没问题,保持参数的属性不变(即左右值),传递给下一个函数,万能引用T&&,说了std::forward,”没有完美转发,右值传两层就是左值,失去移动语义“)项目8.说说项目整个流程呢?(这里很深入很仔细地说,导致有点口齿不清,或者说浪费太多时间了)9.webserver应用在七层网络架构哪一层?(应用层)情景题10.描述真实场景,公网一台服务器是怎么准确找到局域网里某一台设备上来的?比如你的手机。也就是说,你的手机把一个请求发送到公网服务器,然后公网服务器处理完之后,把处理完的消息返回给你的手机?先说说怎么找到服务器,然后服务器怎么找到你?(以为是我手机输入baidu.com然后服务器找到我,大概说了 一下请求怎么到公网服务器)没这么简单,请说出更底层的协议是怎么找到的?比如为什么找到的是你的手机而不是别人?或者可以先不说复杂局域网,先回答我局域网的互相交互?(arp协议,ip->mac地址,交换机/路由器根据mac转发)请拓展一下,拓展到外网到局域网?最关键的点就是说怎么被标识?(不懂,被路由器的公网 IP + 一个临时端口号标识的)局域网的手机在外网看来是怎么银行的,怎么保证是发到这个手机,而不是所有手机?(不懂,当时扯到了tcp四元组,这个思路没问题,答案就是内网ip,内网端口,公网ip,公网端口)你可以按照你的想法去分析一下?它能代表这个局域网对外通信,然后官网某一个服务器把消息投递过来,根据唯一的ip找回来,对吧?(这里回答的NAT协议)那是怎么标识的?(答的路由表,有mac地址,实际是nat表)(思路:手机首先是 没有公网ip的,使用nat技术,维护一张映射表(内网ip端口<->公网临时端口)不会错发是因为nat表的映射是一对一的,除非端口冲突或者没有nat穿透(这里必然被追问穿透,我是没讲这里))11.mac地址是哪一层?(数据链路层)12.所以你前面跳过了很多层对吗?(数据链路层到xx层一路解包,这个过程有点忘记了,因为八股不常见,磕磕绊绊)(思路:物理层01比特流->数据链路层(检查mac地址)- >(网络层检查dest ip)->传输层(端口号)->应用层)13.上一面udp和tcp挖完了,你听说过quic协议吗?(在应用层使udp可靠,http3使用,这里想扯到抖音直播表达被打断)别发散(说了减少对头阻塞,和快速握手)quic对比tcp的优点?不能对比udp,只能说除了udp对比tcp的优点外的优点(1.应用层保证了消息可达,后面网络延迟,他不问了)(思路:quic基于udp,内建了加密和多路复用,0-rtt直连- 无队头阻塞- 连接迁移(Connection ID)- 用户态实现,易迭代)14.epoll里面的reactor和proactor的对比,区别?(proactor是异步,是内核直接去处理缓冲区的数据,而不是依靠主线程io,目前nginx就是利用多进程去模拟proactor,proactor是我昨晚,你来取结果)说说同步和异步的对比?(同步处理以来非阻塞队列,异步无需考虑,内核态处理)15.遍历二维数组,按行和按列,那个快(说的内存连续)但是内存不是随机访问吗?(虚拟内存部分)给我说清楚访问过程(扯了vector是怎么被访问的,说的有点磕磕绊绊,大概size是怎么二倍增长)虚拟内存为什么存在?(扯物理内存和os怎么一步步到虚拟内存,为了解决内存碎片化的问题,总之就是块不连续)那物理内存是怎么映射到物理内存(linux就是四级页表,为什么有页表,为什么要有页框,四级页表如何逐级映射,给我说死了)(思路:内存连续还有空间局部性,同一行cache line被连续访问,缺页次数少,命中率高虚拟内存:隔离进程地址,让程序认为有连续内存,允许物理内存不连续。映射:四段索引,页目录->页表->页框->物理地址)16.中间件主要用的mysql?(目前redis和mysql)算法找旋转数组的最小值,说出思路开撕,二分秒了,怎么二分,画图解说,然后假设是连续的数组,加入没有旋转,代码怎么跑?(诶,我真的就死这里了)后面自己找出了bug,说很好奇,为什么自己越界访问,飞书没报错。引出1717.什么会导致cpp未定义行为()类似hr面的问题18.你是人工智能专业,为什么没有人工智能?前10%是什么水平?19.怎么用的ai(角色+上下文背景+todolist,说我太啰嗦,还可以总结)20.评价自己(这里踩雷了,说自己可靠加神搓搓)优点就这一个?缺点就这一个?(被为难死了)21.你的同学怎么评价你?(神搓搓,能干事但干的不是特别好)建议体系化表达,其余看邮件(那就是挂了)这里也踩雷了,问到了一些面试官隐私的问题。目前这个部门在做一些c端的产品。后续心已飞去携程,让hr催,hr催一次,说要考虑留我,催hr两次,得知已挂。简历被锁,清明后释放。秋招见,字节
面试中,你被问过哪些奇葩...
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

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