数组实现缓存的核心是利用其顺序性管理生命周期,适合轻量可控场景;用数组存key维护访问顺序,map存数据实现o(1)查找,get时key置尾、put超容时删头,手动实现lru。

用数组实现数据缓存,核心是利用数组的顺序性与可变性来管理缓存项的生命周期,尤其适合轻量、可控、需手动控制访问顺序的场景(比如小型 LRU 缓存、临时计算结果队列)。它不依赖外部库,代码透明,但要注意性能边界。
数组作为缓存容器的基本结构
数组本身不带键值映射能力,所以通常搭配 Map 或普通对象一起使用:用数组记录 key 的访问顺序,用 Map 存储实际数据和元信息(如时间戳、过期时间)。这样既保留顺序管理能力,又避免数组遍历查找带来的性能损耗。
- 数组只存 key(如
['user_101', 'config_theme']),不存原始数据 - Map 存 key → { value, timestamp, ttl },支持 O(1) 查找
- 每次 get 操作后,把对应 key 移到数组末尾,表示“最近使用”
- put 时若超容量,删数组开头的 key,并从 Map 中同步删除
手动维护 LRU 行为的关键操作
LRU(Least Recently Used)靠“访问即置尾、满则删头”实现。数组天然适合这种线性调度,但需注意方法选择:
-
移到末尾:用
arr.splice(arr.indexOf(key), 1)删除原位置,再arr.push(key)—— 简单直接,适合小规模缓存( - 避免重复 key:插入前先检查是否存在,存在则先移除再 push,防止数组中出现重复键
-
清空最久未用项:取
arr[0]获取最老 key,map.delete(arr.shift())同步清理
支持过期时间的数组缓存组合
纯数组无法自带时效判断,必须配合时间字段。推荐在 Map 中为每项记录 expiresAt(时间戳),读取时校验:
- get 时先查 Map,若存在且
Date.now() 才返回 value - 若已过期,调用
map.delete(key)和arr.splice(arr.indexOf(key), 1)清理 - set 时统一计算
expiresAt = Date.now() + ttl,再写入 Map 并更新数组顺序
适用场景与注意事项
数组缓存不是万能方案,它适合明确知道容量上限、访问模式简单、且对性能要求不极端的内部逻辑:
- ✅ 适合:插件内临时状态缓存、表单输入建议历史、轻量级函数结果记忆(如格式化工具)
- ❌ 不适合:高频并发读写、上千级 key、需精确毫秒级过期控制的业务
- ⚠️ 注意:数组
indexOf和splice在大数据量下是 O(n),若缓存项常超 200,建议换双向链表 + Map











