LFU策略在长尾访问场景下并不比LRU更合适——恰恰相反,它容易失准,甚至劣于LRU。长尾场景中大量key零星访问、间隔长、频次低,LFU的频率统计因衰减和概率计数机制严重失真,导致冷热误判,而LRU基于时间局部性反而更稳定。

LFU策略在长尾访问场景下并不比LRU更合适——恰恰相反,它容易失准,甚至劣于LRU。
长尾访问场景下LFU的“频率统计”会严重失真
长尾场景指大量key被零星访问(如用户个性化推荐项、冷门商品页),单个key访问间隔长、频次低(平均
- 首次访问时,
lfu_log_factor默认为10,计算阈值P = 0 * 10 + 1 = 1,随机数R ∈ [0,1)必然满足R ,所以一定+1 → 计数器变1 - 但第二次访问若间隔超过
lfu-decay-time(默认1分钟),计数器已衰减回0 → 相当于“重头开始”,又只能涨到1 - 结果:无论一个key被访问10次还是100次,只要间隔拉长,它的
OBJECT FREQ返回值长期卡在0或1,无法区分真实热度
LFU的随机采样淘汰在长尾数据中加剧误删
LFU淘汰时不遍历全量key,而是每次从所有key中随机抽取maxmemory-samples个(默认5个),再从中挑OBJECT FREQ最小的删。在长尾场景下:
- 海量低频key的
OBJECT FREQ几乎全是0或1,彼此无差异 - 抽样5个key,很可能全是“逻辑计数=1”的冷key,系统随机删掉其中一个——完全不反映访问价值
- 而真正有微弱但稳定访问的key(比如每天1次),因衰减和采样漏掉,反而比纯一次性key更易被淘汰
LRU在长尾场景下反而更鲁棒
LRU只依赖lru字段记录最后一次访问时间戳(24位,精度≈1ms),不涉及计数与衰减:
- 哪怕一个key每月只访问1次,只要没超内存上限,它就始终保留在缓存中
- 淘汰时同样抽样5个key,但比较的是“空闲时长”,对长周期访问天然友好
- 没有概率更新、没有衰减漂移、没有计数饱和(255封顶)问题,行为可预测
真正适合LFU的,是那些访问集中在短时间窗口、频次差异巨大的场景(如秒杀商品ID、登录态session),而不是长尾。用错场景时,LFU不是“更精准”,而是把简单问题复杂化——衰减参数调不准,lfu-log-factor改大了低频key永远涨不上去,改小了又和LRU差不多;抽样量maxmemory-samples设高了影响性能,设低了淘汰随机性失控。这些细节一旦忽略,LFU就变成一个难调、难测、难解释的黑盒。


















