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 算法能够有效地平衡缓存的利用率和数据的访问频率,使得缓存淘汰策略更加智能和高效。

相关推荐
w_t_y_y4 小时前
Nginx Plus
运维·数据库·nginx
源代码•宸5 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
川贝枇杷膏cbppg5 小时前
dm_unknown_202512.log:达梦数据库 “未分类日志“
数据库·oracle
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
求学中--6 小时前
MySQL 数据库完整操作命令与使用指南
数据库·sql·mysql·oracle
code bean6 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
DKunYu7 小时前
误删数据库表导致出现1146报错
数据库
武子康8 小时前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
xinyu_Jina8 小时前
动态媒体资源解析器:PWA、离线缓存与用户数据隐私的架构设计
缓存·媒体
惜分飞8 小时前
sql server 事务日志备份异常恢复案例---惜分飞
前端·数据库·php