Validator 缓存与性能调优
概述
schema-dsl 会把 schema 编译成可重复执行的验证函数。CacheManager 负责保存这些编译结果,避免同一个 schema 在高频验证场景下反复编译。
大多数项目不需要直接创建 CacheManager。你通常只需要正常调用 validate()、validateAsync() 或 new Validator();只有下面这些场景才需要阅读本页:
核心功能
- ✅ LRU(最近最少使用)淘汰策略
- ✅ TTL(生存时间)过期机制
- ✅ 命中率统计
- ✅ 可配置的缓存大小
- ✅ 自动清理过期缓存
快速开始
API 参考
构造函数
参数:
get(key)
获取缓存值。
返回值:
- 命中:返回缓存的值
- 未命中或过期:返回
null
行为:
- 更新访问时间(LRU)
- 增加访问计数
- 将条目移到队列末尾
set(key, value, ttl?)
设置缓存值。
行为:
- 如果达到最大容量,自动淘汰最久未使用的条目
- 记录创建时间和访问时间
delete(key)
删除缓存条目。
has(key)
检查缓存是否存在(不更新访问时间)。
clear()
清空所有缓存。
getStats()
获取缓存统计信息。
resetStats()
重置统计信息。
size()
获取当前缓存条目数量。
配置选项
缓存大小
TTL 设置
禁用缓存
统计信息
命中率分析
监控仪表板
缓存边界
CacheManager 缓存的是重复 schema cache key 对应的已编译 validator。它可以减少重复 AJV 编译,但不能让无限动态 schema 形态变成零成本。
- 稳定 schema 结构 + 复用同一个
Validator实例:预期可以命中缓存。 - 每个请求都
new Validator():每个实例都会从新缓存开始,之前的命中无法复用。 - 每个请求都是不同 schema 结构:即使
maxSize很大,也会持续出现缓存未命中和淘汰。
如果低命中率来自高基数动态 schema,应优先约束或复用 schema 形态。只有缓存条目会再次被使用时,单纯增大 maxSize 才有意义。
最佳实践
1. 合理设置缓存大小
2. 开发环境禁用缓存
3. 定期检查性能
4. 在 Schema 更新时清除缓存
LRU 淘汰机制
当缓存达到最大容量时,自动淘汰最久未使用的条目:
相关文档
对应示例文件
示例入口: cache-manager.ts
说明: 覆盖 set/get/has、LRU 淘汰、统计信息读取和 resetStats() 的实际行为。