功能说明
示例用 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,可对比过期与容量淘汰两条路径。