Redis面试那些源码细节没说的,帮你加分必看解析
- 问答
- 2026-01-18 13:10:30
- 3
面试官问你Redis,很多时候不是想听你背书本上的概念,而是想看看你有没有深入理解它内部是怎么“干活”的,很多源码里没明说,但对理解和解决问题至关重要的细节,才是加分的关键,咱们就聊几个这样的点。
第一,Redis真的是单线程吗?这个“单线程”到底指什么?
(来源:Redis官方文档及核心开发者访谈) 很多人会脱口而出:Redis是单线程的,所以线程安全,这个说法不完整,容易掉坑里,Redis的“单线程”指的是处理我们客户端发来的命令请求的核心网络模块和键值对读写逻辑,是由一个线程来完成的,你不用担心多个命令同时执行会乱套,这确实是线程安全的。
但Redis真的只有一个线程在跑吗?不是的,它还有其他的后台线程在默默工作,在比较新的版本中,一些耗时的操作,如UNLINK(异步删除大Key)、AOF的刷盘(可以配置为每秒刷盘模式)等,是由额外的后台线程负责的,这样做的目的是避免这些慢操作阻塞了主线程,影响其他命令的响应,准确的说法是:Redis的命令处理是单线程的,但整个Redis服务进程内是多线程的,如果你在面试中能把这个区别讲清楚,面试官会觉得你对Redis的并发模型理解得更透彻。

第二,持久化机制RDB和AOF,子进程干活时主线程在干嘛?会阻塞吗?
(来源:Redis源码解析及相关技术博客)
当我们需要生成RDB快照时,Redis会调用fork系统调用创建一个子进程,这个子进程会拥有和主进程一模一样的内存数据副本,然后由子进程负责将数据写入磁盘的RDB文件,这里的关键细节是:fork操作本身,在绝大多数情况下是一个很快的操作,尤其是在现代操作系统使用了“写时复制”(Copy-on-Write)技术后。fork瞬间并不会真正复制庞大的内存空间,而是和父进程共享内存页,只有当父进程(主线程)或子进程试图修改某个内存页时,操作系统才会复制该页,从而实现分离。
创建子进程的过程本身对主线程阻塞时间极短。在子进程生成RDB文件的过程中,主线程可以继续正常处理客户端的命令,这正是Redis高性能的一个重要原因,这里有个“:如果Redis实例的内存占用非常大(比如几十个GB),那么即使fork操作很快,也需要为主进程准备巨大的页表,这个过程在极端情况下可能会导致主线程被短暂阻塞(毫秒到秒级),如果主线程在子进程存活期间频繁地修改数据,会触发大量的“写时复制”,导致内存压力增大,能谈到这个层面,就说明你不仅知道原理,还思考过它的边界条件和潜在风险。
AOF重写也是类似的道理,也是通过fork子进程来完成的,主线程继续服务。

第三,过期键的删除策略,真的准时吗?
(来源:Redis源码注释及《Redis设计与实现》)
我们设置一个键的过期时间,比如set key value ex 10,希望10秒后这个key自动消失,Redis是怎么保证它准时被删除的呢?很多人会以为有个定时器在倒计时,时间一到就删,如果真这么干,Redis里有成千上万个过期键,光维护这些定时器就累死了。
Redis采用了两种策略结合的懒惰方法:
- 惰性删除:当客户端尝试访问一个key时,Redis会先检查它是否已过期,如果过期了就立刻删除,然后返回空值,这是被动触发。
- 定期删除:Redis会每隔一段时间(默认100毫秒)随机抽取一批设置了过期时间的key,检查并删除其中已过期的,如果这批key中过期的比例很高,它会继续再抽一批,直到比例降下来。
这意味着,一个过期的key,如果一直没人访问,它最多会在内存里多存活一段时间(最多可能比过期时间晚100毫秒甚至更多一点才被定期任务清理掉),它不是一个精确的定时删除,Redis的过期删除是存在一定延迟的,理解这一点,在设计一些对时效性要求极高的场景时(比如秒杀库存锁),你就会更加谨慎。

第四,管道(pipeline)为什么快?它和事务有什么区别?
(来源:Redis协议规范及性能优化指南) 管道快的原因很简单:它减少了网络往返时间,没有管道时,发一个命令,等待Redis返回结果,再发下一个,网络延迟(RTT)占了大部分时间,管道是把多个命令打包,一次性发送给Redis,然后一次性读取所有的返回结果,这样,N条命令只经历了一次网络往返,自然快得多。
那它和事务(MULTI/EXEC)有什么区别呢?这是面试高频题。
- 管道是一种客户端技术,是一种优化网络通信的手段,它不保证命令的执行顺序(虽然通常是按顺序的,但服务器端并不做强制保证),更没有原子性,即使中间有命令执行失败,后面的命令也会继续执行。
- 事务是服务器端的功能,当执行MULTI后,Redis会将后续的命令排队,当执行EXEC时,它会原子性地按顺序执行队列中的所有命令,在执行过程中,不会被其他客户端的命令打断。
关键点来了:你可以把管道和事务一起用!也就是说,你可以把MULTI、多个命令、EXEC这一整套操作通过管道一次性发送给Redis,这样既享受了管道的网络优化,又获得了事务的原子性,能点明这一点,绝对是加分项。
把这些源码背后“没明说”的细节想明白,在面试中娓娓道来,不仅能展示你的技术深度,更能体现你是一个爱思考、能解决实际问题的开发者。
本文由雪和泽于2026-01-18发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/83052.html
