Redis里FIFO到底咋这么快,原理和机制简单聊聊
- 问答
- 2026-01-24 17:18:28
- 3
Redis里FIFO(先进先出)那么快,其实核心在于它根本不用真的去“排序”或“比较”,而是用一种极其简单直接的方式来管理数据,就像排队买票一样自然,它的快,是“偷懒”和“利用硬件”的结合。
最典型的FIFO场景就是当Redis被用作缓存,并且设置了maxmemory策略为volatile-lru或allkeys-lru之外的简单淘汰时(比如noeviction不淘汰,或者allkeys-random随机淘汰),但程序自身主动以FIFO逻辑管理数据,更直接的FIFO实现是使用Redis的List列表数据结构。
它的原理,说白了就是“插队尾,取队头”,Redis的List底层实现之一是一个叫双向链表的东西(来源:Redis官方文档对List数据结构的说明),你可以把它想象成一根链条,每个环节都连着前一个和后一个,当你要执行FIFO的“入队”操作时,Redis就用LPUSH或RPUSH命令,把新数据塞到链表的头部或尾部(取决于你约定的队头在哪一边),这个操作就是改一两个链接指针,速度是常数级别的,无论这个链表已经有10个数据还是1000万个数据,这个“接上去”的动作都一样快。
反过来,“出队”时,你用RPOP或LPOP从另一端把数据取出来,这个操作更简单,就是断开开头的那个链接,然后把链表的头指针指向下一个环节,同样,这个操作也是常数级别的,瞬间完成。
为什么这么快?原因有三:
- 没有搜索成本:真正的FIFO不需要知道谁“最老”或“最新”,它只认位置,队头就是最老的,这个信息由链表结构本身直接维护着,拿的时候根本不用找。
- 内存操作:所有数据都在内存里,链表指针的修改是纯粹的内存读写,速度是纳秒级的,比磁盘操作快成千上万倍。
- 简单即快速:算法越简单,执行路径越短,CPU效率越高,FIFO的逻辑就是“追加”和“移除”,没有任何复杂的比较、计算或树结构的平衡操作。
再来看看缓存淘汰中的近似FIFO(实际是LRU的简化),Redis在内存满时采用的近似LRU算法,虽然名字叫LRU(最近最少使用),但为了速度,它也是一种近似FIFO的变种(来源:Redis官方文档对缓存淘汰算法的说明),它并不是给每个数据严格记录访问时间戳,而是随机采样几个键,然后从这里面挑一个最久没用的淘汰掉,当访问模式比较平均时,这个随机采样出来的“最旧”键,很可能就是最早进来的那个之一,这个机制之所以快,是因为它避免了给所有数据维护一个精确的全局时间排序队列(那会非常耗内存和CPU),而是用一点点随机性,换来了巨大的速度提升和可接受的效果。
总结一下,Redis里FIFO的快,本质是:
- 用对了数据结构:双向链表让入队出队变成O(1)的绝对快速操作。
- 利用了内存优势:所有操作在内存中进行,毫无延迟。
- 设计了“差不多就行”的聪明策略:在缓存淘汰等场景,用随机采样近似实现淘汰最旧数据,用微小的精度损失换取巨大的性能收益。
它快就快在“不较真”,它不追求绝对的、完美的顺序,而是用最直接、最物理的方式(链表指针)或最取巧的方式(随机采样)来达到90分的效果,同时把速度拉满,这就是Redis哲学的一部分:在数据结构与算法上做极致的优化,用简单和直接来换取惊人的速度。

本文由瞿欣合于2026-01-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/85211.html
