← 中文资源

简体中文版本

带容量与 TTL 的 Rust LRU 缓存

用 HashMap 保存值与过期时间、VecDeque 维护最近使用顺序,读取时淘汰过期项,写入时按容量移除最久未用条目。

阅读英文原文

功能说明

示例用 HashMap 保存键、值与过期时间,用 VecDeque 维护最近使用顺序。get 先判断是否过期,过期则删除并按未命中返回;命中时把键移到队尾。put 插入或覆盖条目并刷新过期时间,超过容量时从队首淘汰最久未使用的键。示例容量为 2、TTL 为 50 毫秒。

关键代码

fn touch(&mut self, key: &K) {
    self.order.retain(|existing| existing != key);
    self.order.push_back((*key).clone());
}
...
while self.entries.len() > self.capacity {
    if let Some(oldest) = self.order.pop_front() {
        self.entries.remove(&oldest);
    }
}

touch 先删除旧位置再追加到队尾,保证顺序队列中没有重复键。

使用注意

  • VecDeque::retain 是 O(n),键很多时每次命中都要线性扫描,不如链表加节点指针高效。
  • 过期条目只在 get 命中该键时清理,长期不访问的键会占用内存。
  • put 覆盖已有键时不会增加长度,但仍会刷新 TTL 并更新顺序。
  • Instant 单调递增,适合计算 TTL,不受系统时间调整影响。
  • 没有后台清理线程,容量淘汰可能先移除未过期但最久未用的条目。

验证方式

示例写入 a、b 后访问 a,再写入 c 应淘汰 b;等待 60 毫秒后访问 a 返回 None。把 TTL 调大或去掉 sleep,可对比过期与容量淘汰两条路径。