缓存代理通过闭包维护私有cache对象,对相同参数请求直接返回缓存结果,避免重复遍历与计算;支持参数归一化、结果节流、分片缓存等优化策略,显著提升大批量数据过滤性能。

用闭包实现缓存代理,核心是把“查过什么、结果是什么”记在内存里,下次相同请求直接返回,跳过原始数据过滤逻辑——这对后端大批量原始数据(比如万级数组遍历、多条件筛选、聚合计算)特别有效。
缓存代理怎么搭:一个可复用的 memoize 工厂
不写死某个函数,而是做一个通用工厂,输入任意过滤函数,输出带缓存能力的新函数:
- 用闭包维持一个私有 cache 对象,键由参数序列化生成(如
JSON.stringify(args)或简单拼接) - 每次调用先查 cache,命中就立刻返回;未命中则执行原始过滤逻辑,存结果再返回
- 避免直接缓存大型原始数据对象(如整个用户列表),只缓存轻量结果(如过滤后的 ID 数组、统计值、布尔标记)
针对大批量原始数据的关键优化点
原始数据量大时,光缓存不够,得配合策略减少首次开销:
-
参数归一化:把等价但形式不同的请求转成同一 key。例如
filter(data, {status: 'active', page: 1})和filter(data, {page: 1, status: 'active'})应视为相同请求 -
结果节流:对高频变动的数据(如实时日志),加 TTL 或版本戳,避免缓存陈旧结果。可用
Map+ 时间戳或引入简易过期机制 -
分片缓存:如果过滤常按某字段(如
category)区分,可把 cache 拆成多个子 map,降低单个对象体积和查找冲突概率
实际过滤场景示例
假设你有一个含 5000 条订单的原始数组,需频繁执行「按状态+时间范围筛选」:
- 原始函数每次都要遍历全部 5000 条,耗时约 8–12ms
- 加上缓存代理后,相同参数第二次调用耗时降至
- 若搭配参数归一化(如统一排序 key)和 JSON 序列化 key,不同调用顺序也能命中
- 注意:原始数据本身不进 cache,只存筛选结果(如 137 个订单 ID),内存友好
小心这些坑
闭包缓存不是万能胶,用错反而拖慢系统:
- 原始数据频繁更新?缓存可能失效——加版本号或监听变更事件主动清 key
- 参数含函数、Date、RegExp 等无法 JSON 序列化的值?改用结构化参数或自定义 key 生成逻辑
- 缓存无限增长?定期清理(如 LRU 策略)或限制最大条目数,防内存泄漏











