Redis到底是怎么跑起来的,内部那些运行细节和逻辑其实挺有意思的
- 问答
- 2026-01-14 04:53:28
- 2
主要参考自《Redis设计与实现》一书、Redis作者Salvatore Sanfilippo的博客文章以及Redis官方文档中的相关技术说明)
Redis能跑得飞快,感觉像是有魔法一样,但其实它的内部机制非常实在,咱们可以把它想象成一个超级高效、身兼数职的“单线程小店老板”。
第一,核心秘密:单线程怎么还能这么快?
很多人一听说Redis是单线程的,第一反应是“那不会很慢吗?” 这恰恰是Redis设计最精妙的地方,这个“单线程”指的是它处理网络请求和执行命令的核心模块,只有一个线程在工作,你可能会问,现在服务器都是多核的,这不是浪费吗?
Redis的作者是这么考虑的:对于一个内存数据库来说,性能的瓶颈往往不在CPU的计算速度,而在于网络I/O和内存的访问速度,如果采用多线程模型,虽然能利用多核,但会引入一个超级麻烦的问题——锁,多个线程同时去读写同一块数据,为了保证不出错,就必须加锁,加锁、释放锁、线程间的切换会带来巨大的开销,反而可能让整体性能下降,而且把系统搞得非常复杂。
Redis干脆就用一个线程来处理所有命令,这样做的好处是:
- 没有锁的烦恼:完全不需要考虑并发冲突,所有操作都是顺序执行的,简单又安全。
- 极致的内存效率:因为数据都在内存里,CPU操作内存的速度是纳秒级别的,一个线程就足以压榨出极高的吞吐量。
- 避免上下文切换:多线程切换需要保存和恢复现场,单线程就没这个开销。
那它怎么应对海量的连接呢?这就依赖于它采用的I/O多路复用技术(比如Linux下的epoll),你可以把这个技术想象成老板的一个“万能对讲机”,这个对讲机可以同时监听成千上万个客户的呼叫(网络连接),当某个客户点好菜(发送了命令数据)时,对讲机才会通知老板,老板就过去处理这个客户的请求,处理完后立刻回来监听对讲机,这样,一个老板就能高效地服务无数客户,而不用傻等着某一个客户,这就是单线程也能高并发的关键。
第二,内存里数据的“百宝箱”:数据结构
Redis快,另一个原因是它不像传统数据库那样,只把数据简单存成表,它直接把数据存放在自己实现的、非常精细的数据结构里,这些数据结构就像是老板身后那个分类极其清晰、拿取极其方便的货架。
- 简单动态字符串(SDS):这可不是普通的C语言字符串,它更聪明,比如在字符串长度变化时,它能提前分配好多余的空间,避免每次修改都重新分配内存,这叫“预分配”;它还记录了字符串的长度,查询长度是O(1)的复杂度,非常快。
- 字典(Hash Table):这是Redis的核心,用来实现各种数据类型,它的哈希表设计有两个“小妙招”,一是它使用“链地址法”解决哈希冲突(就是多个键映射到同一个位置时,用链表串起来),二是它会进行“渐进式rehash”,当哈希表太满需要扩容时,它不是一次性把所有数据搬到新表(那会卡住整个服务),而是分批慢慢搬,在搬迁期间,同时维护新旧两个表,查询时会同时查两个,新增的数据直接放到新表,这样就把一个大操作拆分成无数个小步骤,避免了服务停顿。
- 跳跃表(Skip List):这是实现“有序集合(ZSet)”的关键,你可以想象一个链表,但有些节点有多层“索引”,从最高层索引开始查找,可以大跨步地跳过很多节点,效率堪比平衡树,但实现起来简单多了。
第三,数据持久化:把内存里的东西记到“小本本”上
内存数据一断电就没了,所以Redis需要把数据存到硬盘上,这叫持久化,它主要有两种方式,就像老板记账:
- RDB(快照):相当于在某个时间点,给整个数据库拍一张完整的照片,然后存成一个文件,这个操作是由子进程来完成的(注意,不是主线程),主线程会fork出一个子进程,子进程拥有和主线程一模一样的内存数据副本,然后由子进程负责把数据写入硬盘,这样主线程可以继续提供服务,不受影响,RDB的优点是恢复大数据集时速度很快,但可能会丢失最后一次快照之后的数据。
- AOF(追加日志):相当于老板把每一个收到的命令都记在一个账本上,当Redis重启时,只要把账本上的命令按顺序重新执行一遍,就能恢复数据,为了平衡性能和安全性,AOF有不同的策略,比如每秒同步一次到硬盘,或者每条命令都同步(最安全但最慢),AOF文件会越来越大,所以Redis提供了AOF重写机制:也是fork一个子进程,根据当前数据库状态,生成一个全新的、最精简的命令序列AOF文件,来替换旧的。
第四,过期键的清理:“定期巡检”与“顺手牵羊”
Redis可以给键设置过期时间,那过期的键是怎么被删除的呢?它用了两种策略:
- 惰性删除:当客户来访问一个键时,Redis才会检查它是否过期,如果过期就当场删除,这很“懒”,但很高效,不会在无关的键上浪费CPU。
- 定期删除:光靠“懒”不行,万一有些键永远没人访问,就成了“僵尸键”,所以Redis会每隔一段时间,随机抽查一些设置了过期时间的键,把其中过期的删除掉,这是一种主动的、抽样式的清理。
通过这套“单线程+多路复用”的事件模型、精心设计的数据结构、巧妙的持久化和内存管理机制,Redis这个“小店老板”就能以惊人的速度和可靠性为我们服务了,它的设计哲学充满了权衡与智慧,在简单与高效之间找到了一个完美的平衡点。

本文由水靖荷于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/80351.html
