Redis -LFU(Least Frequently Used,最少使用频率)缓存淘汰算法

在 Redis 的 LFU(Least Frequently Used,最少使用频率)缓存淘汰算法中,lru 字段被拆分成两部分:高 16 位存储 ldt(Last Decrement Time),低 8 位存储 logc(Logistic Counter)。这个设计使得 Redis 能够有效地结合访问频率和时间因素来管理缓存数据的淘汰策略。

1. lru 字段的拆分

  • 高 16 位 (ldt):
    ldt 表示最后一次衰减操作的时间戳,精度为秒。这一部分用于记录 key 的最近一次访问时间,以便在下一次访问时根据时间差异计算衰减量。

  • 低 8 位 (logc):
    logc 是逻辑计数器,用于跟踪 key 的访问频率。初始值通常为 5,但这个值并不是简单的访问次数,而是基于访问频率的一个动态值。logc 的值越小,表示该 key 的访问频率越低,因此更容易被淘汰。

2. logc 的衰减机制

在 Redis 的 LFU 算法中,每次访问一个 key 时,首先对 logc 进行衰减操作。衰减的目的是为了让 logc 能更准确地反映访问频率,而不仅仅是访问次数。具体来说:

  • 衰减的计算方式

    衰减的量取决于当前时间与上次访问时间 (ldt) 的差值。如果这次访问与上次访问的时间间隔较大,那么衰减量就会更大。这样,即使一个 key 在某一时段内被频繁访问,但如果长时间没有再被访问,logc 也会逐渐减少,反映出它的使用频率在降低。

  • 衰减的目的

    通过这种衰减机制,Redis 能够动态调整 key 的使用频率。当一个 key 长时间没有被访问时,其 logc 值会显著下降,表明它的使用频率降低,从而提高其被淘汰的概率。

3. logc 的增加机制

在对 logc 进行衰减操作后,Redis 会根据当前的访问情况决定是否增加 logc 的值。增加操作并不是简单地在每次访问时加 1,而是采用一种概率增加的方式。

  • 概率增加的原因

    为了防止 logc 增长过快,Redis 引入了概率机制。logc 值越高,进一步增加的难度就越大。这样设计的目的是确保那些频繁访问的 key 才能在长期内保持较高的 logc 值,而偶尔访问的 key 即使有几次访问,也不会让 logc 增长太多。

  • 增加的过程

    每次访问时,Redis 会基于当前的 logc 和一些内部参数来计算一个增加 logc 的概率。如果概率条件满足,则 logc 增加,否则保持不变。这种方式确保了 logc 值能准确反映长期的访问频率,而非短期内的访问突增。

4. 总结:Redis LFU 算法的工作机制

在 Redis 中,LFU 算法通过 lru 字段的 ldtlogc 的结合,使得缓存淘汰策略更加精确和灵活:

  1. 衰减阶段 :Redis 在每次访问 key 时,根据当前时间与上次访问时间之间的差值,对 logc 进行衰减。时间差越大,衰减越多,表示该 key 的使用频率在降低。

  2. 增加阶段 :衰减后,Redis 再根据概率决定是否增加 logclogc 值越高,增加的难度越大。这种机制确保频繁访问的 key 才能在长期内保持较高的 logc 值。

  3. 淘汰策略 :在需要淘汰缓存项时,Redis 会优先淘汰 logc 较低的 key,这些 key 代表的是访问频率较低或者已经很久没有被访问的缓存数据。

通过上述机制,Redis 的 LFU 算法能够有效地平衡缓存的利用率和数据的访问频率,使得缓存淘汰策略更加智能和高效。

相关推荐
剩下了什么8 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥8 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉8 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变8 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记10 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里11 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科11 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦11 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
indexsunny12 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
晚霞的不甘13 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d