Guava Cache淘汰算法

Guava Cache 使用的淘汰算法是 "基于访问顺序的近似 LRU,具体来说是一种分段 LRU" 实现,注意是近似LRU。

Guava Cache 借鉴了 ConcurrentHashMap的分段锁思想,将缓存分成多个 "Segment"(段),每个 Segment 内部维护自己的访问队列,实现独立的 LRU 淘汰。

数据结构设计

每个 Segment 内部维护两个双向链表

java 复制代码
// 简化的数据结构示意
class Segment<K, V> {
    // 基于访问顺序的双向链表(LRU核心)
    @Nullable ReferenceEntry<K, V> accessQueueHead;  头部
    @Nullable ReferenceEntry<K, V> accessQueueTail;  尾部
  
    // 基于写入顺序的双向链表(用于过期策略)
    @Nullable ReferenceEntry<K, V> writeQueueHead;   头部
    @Nullable ReferenceEntry<K, V> writeQueueTail;   尾部
}

访问顺序维护

当缓存项被访问时(读或写),Guava 会将其移动到访问队列的尾部"(MRU 端):

java 复制代码
// 伪代码:记录访问
void recordAccess(ReferenceEntry<K, V> entry) {
    // 从当前位置移除
    evictFromAccessQueue(entry);
    // 添加到尾部(最近使用)
    addToAccessQueue(entry);
}

淘汰发生在写入新数据时,当缓存大小超过限制:

java 复制代码
// 伪代码:淘汰过程
void evictEntries() {
    if (!overMaximumSize()) {
        return; // 未超限,不淘汰
    }
    
    // 从访问队列头部(LRU端)开始淘汰
    ReferenceEntry<K, V> eldest = accessQueueHead;
    while (eldest != null && overMaximumSize()) {
        // 移除最久未使用的条目
        removeEntry(eldest, RemovalCause.SIZE);
        eldest = accessQueueHead; // 移动到下一个
    }
}

为什么是"近似"LRU?

Guava Cache 的 LRU 是近似的,主要原因:

1、并发性能优化:在并发环境下,为了减少锁竞争,访问记录的更新是延迟的:

java 复制代码
// 读操作时并不立即更新队列,而是先记录"可能需要更新"
void get(key) {
    Entry entry = findEntry(key);
    if (entry != null) {
        // 不是立即移动,而是设置标志位
        entry.setAccessTime(System.currentTimeMillis());
        // 实际的队列更新可能批量进行
    }
}

2、分段设计的影响

由于缓存被分成多个 Segment,每个 Segment 独立维护 LRU 队列。淘汰时:

1、优先淘汰访问频率最低的 Segment" 中的条目

2、而不是全局严格的 LRU 顺序

淘汰的过程案例

java 复制代码
初始: [A]
添加B: [A, B]        // A(最久), B(最新)
添加C: [A, B, C]     // A(最久), B, C(最新)
访问A: [B, C, A]     // B(最久), C, A(最新) - A被移到尾部
添加D: [C, A, D]     // 淘汰最久的B,添加D到尾部
相关推荐
手写码匠5 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光5 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白6 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
sel_97 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
Asize7 小时前
438. 找到字符串中所有字母异位词
算法
Asize7 小时前
283. 移动零
算法
船厂电气自动化ai大模型9 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习
人工智能培训10 小时前
人工智能数据安全下的个人信息保护实践方案
大数据·人工智能·算法·生活
元启数宇11 小时前
幕墙AI设计算法逻辑:元启数宇如何智能分格
人工智能·算法
宵时待雨11 小时前
优选算法专题16:多源BFS
算法·宽度优先