<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LFU on Lishengxie</title><link>https://lishengxie.top/tags/lfu/</link><description>Recent content in LFU on Lishengxie</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 17 Oct 2026 16:16:08 +0800</lastBuildDate><atom:link href="https://lishengxie.top/tags/lfu/index.xml" rel="self" type="application/rss+xml"/><item><title>TinyLFU</title><link>https://lishengxie.top/post/tinylfu/</link><pubDate>Sat, 17 Oct 2026 16:16:08 +0800</pubDate><guid>https://lishengxie.top/post/tinylfu/</guid><description>&lt;h2 id="什么是缓存淘汰策略"&gt;什么是缓存淘汰策略&lt;/h2&gt;&#10;&lt;p&gt;我们知道，现代计算机采用多级存储结构。为了加速程序执行，通常会将数据从低速存储提前加载到访问速度更快的高速存储（缓存）中。&lt;/p&gt;&#10;&lt;p&gt;但是，由于实际数据量可能远超缓存容量，当有新数据需要进入缓存时，就需要按照一定的规则选择并替换旧数据，这就是所谓的缓存淘汰策略。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;a href="https://zh.wikipedia.org/wiki/%E5%BF%AB%E5%8F%96%E6%96%87%E4%BB%B6%E7%BD%AE%E6%8F%9B%E6%A9%9F%E5%88%B6"&gt;维基百科&lt;/a&gt;：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;缓存文件置换机制&lt;/strong&gt;（英语：Cache replacement policies）是计算机管理缓存存储器的一种机制。&lt;/p&gt;&#10;&lt;p&gt;由于缓存空间有限，无法容纳所有数据，因此当新数据需要进入缓存时，必须根据一定的规则选择合适的数据进行替换，这种规则就称为缓存置换机制。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;常见的缓存淘汰策略包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;FIFO（First In First Out）：先进先出，优先淘汰最早进入缓存的数据，类似队列的思想；&lt;/li&gt;&#10;&lt;li&gt;LRU（Least Recently Used）：最近最少使用，优先淘汰距离上次访问时间最久的数据；&lt;/li&gt;&#10;&lt;li&gt;LFU（Least Frequently Used）：最不经常使用，优先淘汰访问频率最低的数据。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;缓存淘汰策略的一项重要评价指标是缓存命中率。我们希望在有限的缓存容量下，尽可能提高缓存命中率，从而减少对低速存储的访问，加速程序执行。&lt;/p&gt;&#10;&lt;h2 id="lru-和-lfu-的问题"&gt;LRU 和 LFU 的问题&lt;/h2&gt;&#10;&lt;p&gt;LRU 通常基于哈希表和双向链表实现，每次访问后将对应数据移动到链表头部，并从链表尾部淘汰数据。LRU 实现简单，在多数场景下也能取得不错的效果。&lt;/p&gt;&#10;&lt;p&gt;但是，LRU 存在缓存污染的问题。例如，当程序进行一次全量数据扫描时，大量只访问一次的数据可能将原有的热点数据挤出缓存，导致后续访问热点数据时，需要重新从下级存储加载。&lt;/p&gt;&#10;&lt;p&gt;LFU 通常可以基于哈希表和小顶堆实现。相比 LRU，LFU 更关注数据的访问频率，能够有效避免一次性扫描造成的缓存污染。&lt;/p&gt;&#10;&lt;p&gt;但是，LFU 需要额外维护缓存项的访问频率信息，带来一定的存储和更新开销。此外，由于历史访问频率不断累积，曾经的热点数据即使不再被访问，也可能长期占据缓存空间，难以及时淘汰。&lt;/p&gt;&#10;&lt;h2 id="tinylfu"&gt;TinyLFU&lt;/h2&gt;&#10;&lt;p&gt;TinyLFU [1] 是一种用于优化传统 LFU 问题的缓存准入策略（Cache Admission Policy）。与直接决定淘汰哪个数据不同，TinyLFU 在新数据进入缓存时，会比较候选数据（Candidate）和待淘汰数据（Victim）的访问频率，选择频率更高的数据保留在缓存中。&lt;/p&gt;&#10;&lt;center&gt;&lt;img src="https://lishengxie.top/uploads/2026/10/image-20261017180123071.png" alt="TinyLFU 缓存准入流程" style="zoom:50%;" /&gt;&lt;/center&gt;&#10;&lt;p&gt;首先，为了解决访问频率统计的存储开销问题，TinyLFU 使用了 Count-Min Sketch（CM-Sketch）。&lt;/p&gt;&#10;&lt;p&gt;CM-Sketch 是一种与布隆过滤器类似的概率数据结构，不同之处在于，其数组中的每个位置存储的是计数值。对于一个 Key，通过多个 Hash 函数映射到数组中的不同位置，并将对应计数器加一；查询时，取这些计数器中的最小值作为访问频率的估计值。&lt;/p&gt;&#10;&lt;p&gt;需要注意的是，由于存在 Hash 冲突，CM-Sketch 不支持直接删除某个 Key 的统计信息。&lt;/p&gt;</description></item></channel></rss>