代代相传
轻而易举, 世代缓存 严格入站限额和有效载荷验证.
如何运作
GenerationalCache 维持两个内部 Map 对象 : current 财务报告和审定财务报表 old。 。 。 .
它使用内部边界为(马克/2美元),允许两代人保持界限,同时保持世代互换的价格.
- 插入验证( V): 新建项目在添加到
current生成. - 晋升:如果您得到了存在于
old一代,它被提升到current生成以确保它在缓存中停留的时间更长. - 一代拆迁: 一旦
current生成大小符合或超过边界阈值( max / 2美元) , 启动代交换: 已存在的old生成被丢弃current世代成为新的old生成, 和一个新的空current生成.
这种两代方法避免了在每个访问上更新时间戳或链接列表指针的间接费用. 虽然它不是标准液态气流转储点的倒置取而代之,但它优先考虑的是原始吞吐量而不是严格的驱逐令.
不使用时
GenerationalCache 如果:
- 您需要严格的LRU驱逐命令.
- 缓存命中率比插入/验证吞吐量更重要.
- 您已经知道您的工作设置大小, 可以提供足够大的 LRU 缓存 .
安装
npm i @asamuzakjp/generational-cache
使用量
import { GenerationalCache } from '@asamuzakjp/generational-cache';
// Initialize with a max capacity of 1024 items and custom size limits
const cache = new GenerationalCache(1024, {
maxKeySize: 4096, // 4 KB limit for keys
maxValueSize: 1024 * 1024, // 1 MB limit for values
strictValidate: true // Enable strict deep validation for objects (default)
});
API 密码
new GenerationalCache(max, opt)
创建一个最大容量为 max 条目.
- 最大数 (数目):缓存可以持有的最大项目数量. 如果指定值小于4,或者指定了无效值,则使用4的默认值.
- 选择 (对象,可选)数字 :
- 缓存功能 (布尔): 如果
true默认为false。 。 。 . - 缓存符号 (布尔): 如果
true默认为false。 。 。 . - 最大键大小 (数目): 最大允许大小
key以字节表示。 默认为8192 (8 KB). - 最大数值 (数目): 最大允许大小
value以字节表示。 默认为1048576 (1 MB). - 严格参数 (布尔): 如果
true默认为true。 。 。 .
- 缓存功能 (布尔): 如果
属性
- 缓存. entryCount (数目,只读): 返回基础总数
entries目前储存在两代人之间. 说明: 为了最大限度地实现书写吞吐量,此库允许在current财务报告和审定财务报表old(例如,当一个项目同时存在于两代人中时)。 报告数目可能超过keys,但仍被缓存的内部容量所束缚. - 缓存.max (数目): 获取或设置最大项容量. 说明: 动态更新此属性 将清除所有已缓存的项目 (它隐含地引用缓存. clear () 来安全地重新计算边界) .
方法
- 缓存. get( 键)
获取一个项目。 如果在
old将自动提升到current用于防止在下次互换时被拆迁.- 回返 (任何未定义的): 与
key,或undefined若为key无法找到.
- 回返 (任何未定义的): 与
- 缓存. set( 键, 值)
添加或更新一个项目。 它在插入前验证键和值(如果是字符串)的字节大小。 如果操作导致
current生成的大小以达到或超过边界阈值,启动一代互换.- 说明: 储存
undefined作为值 不支持,作为缓存.get(key治疗undefined作为缓存错过. - 回返:缓存实例本身( allows 链式).
- 说明: 储存
- 缓存. has( 键)
检查是否
key存在于缓存中(在两代中).- 回返情况:
true如果密钥存在, 否则false。 。 。 .
- 回返情况:
- 缓存. delete( 键)
从缓存中删除项目.
- 回返情况:
true如果物品存在并被移除,否则false。 。 。 .
- 回返情况:
- 缓存。 clear () 启动缓存中的所有项目 .
业绩
基准分为两个州来模拟现实世界的条件:
- 冷 国:用有侵略性的内部垃圾收集来测量,在全V8涡轮箱优化前观察性能.
- 温暖状态:在足够热量后测量,在最佳联合信息技术数据库汇编下,代表持续的吞吐量.
以下结果反映每秒(ops/sec)的持续运行,从平均延迟(ns/iter)计算. 较高的数值表明业绩较好.
环境
1. 小缓存(最大大小=512)
| 假设 | 状态 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|---|
| 设定 | 凉了 | 15,137,754项行动/sec | 4 265 484项行动/sec | 13 800 718项行动/sec | 17 844 397项行动/sec |
| 温暖 | 18 993 352项行动/秒 | 15 299 878项行动/sec | 18,132,366项行动/sec | 19 007 793项行动/sec | |
| 获取 | 凉了 | 16 028 210项行动/秒 | 7 566 013项行动/秒 | 13 881 177项行动/sec | 30 030 030 行动/秒 |
| 温暖 | 17 917 936项行动/sec | 23 523 877起行动/sec | 16 458 196项行动/sec | 39,416,634 行动/sec | |
| 选举 | 凉了 | 16 236 402项行动/秒 | 7 372 457项行动/sec | 14,547,571项行动/sec | 5 407 451项行动/秒 |
| 温暖 | 20 479 214项行动/秒 | 8 993 615项行动/sec | 17,123,288项行动/sec | 7 668 712项行动/sec |
2. 中缓存(最大大小=2 048)
| 假设 | 状态 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|---|
| 设定 | 凉了 | 15 024 038项行动/秒 | 4 537 617项行动/sec | 11 818 934项行动/秒 | 15,110,305项行动/秒 |
| 温暖 | 17 126 220项行动/秒 | 13 299 641项行动/秒 | 15 309 247项行动/sec | 17 070 673项行动/秒 | |
| 获取 | 凉了 | 13 976 240项行动/sec | 8 134 711项行动/秒 | 11 784 115项业务/秒 | 26 315 789项行动/秒 |
| 温暖 | 16 015 375项行动/秒 | 19,425,019 行动/sec | 13 599 891项行动/秒 | 35,663,338项行动/sec | |
| 选举 | 凉了 | 14 858 841项行动/sec | 6 439 979项行动/sec | 12 425 447项行动/秒 | 5,252,929项行动/sec |
| 温暖 | 19,805,902项行动/sec | 7 981 483项行动/秒 | 16,108,247 行动/sec | 7 295 010 行动/sec |
3. 大缓存(最大大小=8 192)
| 假设 | 状态 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|---|
| 设定 | 凉了 | 13 292 569项行动/sec | 3,637,686项行动/sec | 7 970 033项行动/秒 | 11 318 619项行动/sec |
| 温暖 | 17 652 251项行动/秒 | 11 709 602项行动/秒 | 12 781 186项行动/sec | 15 225 335项行动/秒 | |
| 获取 | 凉了 | 13 840 830项行动/秒 | 5,746,136项行动/sec | 11 021 713项行动/秒 | 17 155 601项行动/sec |
| 温暖 | 19,116,804项行动/sec | 17 885 888 行动/sec | 15 664 160项行动/sec | 28 344 671项行动/秒 | |
| 选举 | 凉了 | 14 025 245项行动/sec | 5 358 770项行动/sec | 9 882 399项行动/sec | 4 185 501项行动/秒 |
| 温暖 | 19 249 278项行动/sec | 7 029 383项行动/秒 | 13 646 288项行动/sec | 6 086 798起行动/事件 |
4. 非优先有效载荷(最大尺寸=4 096/严格Validate=为正)
| 假设 | 状态 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|---|
| 设定 | 凉了 | 602,410 行动/sec | 3 003 725项行动/秒 | 9 948 269项行动/sec | 10,231,226项行动/秒 |
| 温暖 | 757 576 行动/sec | 10 964 912项行动/秒 | 14,697,237项行动/sec | 16 572 754项行动/秒 | |
| 获取 | 凉了 | 13,180,440项行动/sec | 7 043 742项行动/sec | 11 037 528项行动/秒 | 17 580 872项行动/秒 |
| 温暖 | 16 170 763项行动/秒 | 19 007 793项行动/sec | 14,363,689项行动/sec | 28 719 127项行动/秒 | |
| 选举 | 凉了 | 617 284 行动/sec | 5 356 186项行动/sec | 12,072,920项行动/秒 | 2 607 222项行动/sec |
| 温暖 | 775 194项行动/sec | 7,504,127项行动/sec | 14 981 273项行动/秒 | 6,208,481项行动/秒 |
5. 非优先有效载荷(最大尺寸=4 096/严格Validate=虚假)
| 假设 | 状态 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|---|
| 设定 | 凉了 | 12 315 271项行动/秒 | 2 650 060次行动/秒 | 10 233 320项行动/秒 | 10 884 946项行动/sec |
| 温暖 | 16 100 467项行动/sec | 10 561 893项行动/秒 | 14,624,159项行动/sec | 16 672 224项行动/秒 | |
| 获取 | 凉了 | 13 835 086项行动/秒 | 7 248 478项行动/sec | 10 714 668项行动/sec | 19 015 022项行动/秒 |
| 温暖 | 16 012 810项行动/秒 | 18 744 142项行动/sec | 14,106,362项行动/秒 | 32 927 231项行动/sec | |
| 选举 | 凉了 | 10 424 268项行动/sec | 5 473 753项行动/秒 | 11 983 223项行动/秒 | 2,544,853项行动/sec |
| 温暖 | 16 291 952项行动/秒 | 6,972,996项行动/秒 | 13 417 416项行动/sec | 5 798 782项行动/秒 |
6. 循环访问(最大尺寸=8 192/工作集=5 000)
| 度量衡 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|
| 点击率 | 78.30% | 100.0% (单位:千美元) | 100.0% (单位:千美元) | 100.0% (单位:千美元) |
| 吞吐量 | 8 783 487项行动/sec | 37,778,617项行动/sec | 38 550 501 行动/sec | 44,742,729项行动/sec |
7. 循环访问(最大大小=4 096/工作套件=5 000)
| 度量衡 | 生成缓存 | 路加锡 | 快递 | 气象学家 |
|---|---|---|---|---|
| 点击率 | 0.00 % (单位:千美元) | 0.00 % (单位:千美元) | 78.30% | 0.00 % (单位:千美元) |
| 吞吐量 | 9 931 472项行动/秒 | 6 396 724项行动/sec | 8 509 189项行动/sec | 6 078 288项行动/sec |
密钥特征
- 高排出效率数字 :
GenerationalCache与大规模驱逐情况下的标准路由和转机设计相比,在高转机工作量期间显示强劲的吞吐量. - 可预测的可伸缩性: 虽然其他图书馆可能因缓存大小增加而出现性能退化,
GenerationalCache由于其世代互换机制,维持了一致的吞吐量. - 平衡读取/写入:它在所有基本业务中提供稳定和有竞争力的业绩(
get, (中文(简体) ),set),使得它既适合读重又适合写重的环境. - 严格校验切换: 默认情况下,非原生有效载荷进行深度验证,以防止超大小物体的内存耗尽,从而会影响写入吞吐量. 残疾
strictValidate恢复写入性能,前提是有效载荷大小由外部管理(见4和5). - 权衡: 在工作集大于
max / 2不过小于max, (中文(简体) ),GenerationalCache将经常发生世代互换和缓存缺失。 最大限度地提高业绩效益GenerationalCache通常最好还是保持max面积小到可以进行一些驱逐,而不是试图适应整个工作组(见6和7).
许可证
麻省理工学院