Yac 2.4.0发布 - 小值读取性能提升64%

Yac 2.4.0发布 - 小值读取性能提升64%

💡 原文中文,约5500字,阅读约需13分钟。
📝

内容提要

Yac 2.4.0发布,主要改进包括:内嵌小值到指针槽位,避免占用values内存,提升读取性能64%;用LZ4替换FastLZ压缩,解压更快;get()支持$default参数区分未命中与假值;dump()支持分页及元信息。实际测试中内存占用从23.5M降至12.4M,吞吐显著提升,适合WordPress缓存场景。

🔎

延伸解读

内嵌值机制的实际收益

Yac 2.4.0 将小值(如空数组、布尔值、小整数)直接编码进指针槽位,避免占用 values 内存。作者博客实测内存占用从 23.5M 降至 12.4M,且 Recycles 归零,说明有效减少了因大量空缓存导致的 values 区循环覆盖。这一改动对 WordPress 这类产生大量负缓存(如搜索无结果)的场景尤为有利,能显著降低内存压力。

get() 新增 $default 参数的意义

此前 get() 在未命中时返回 false,导致无法区分“未命中”和“缓存值为 false”。2.4.0 引入 $default 参数,允许调用者指定默认值,并通过哨兵值(如特殊字符串)配合 === 严格比较来明确判断命中与否。这解决了长期存在的语义模糊问题,使缓存 false 等假值成为可能,提升了 API 的可用性。

dump() 分页与元信息的作用

新增的 $offset 参数支持分页导出缓存条目,避免一次性导出大量数据导致内存溢出。同时,每条记录附带 hits、atime、c_len、embedded 等元信息,便于分析缓存使用情况:高 hits 且近期访问的条目为热数据,而 hits 为 0 的条目可能是只写不读的垃圾,可考虑优化。这为缓存调优提供了数据支撑。

性能提升的适用场景与局限

基准测试显示小值读取性能提升 64%,混合场景提升 70%,压缩值读取提升约 3.5 倍。但作者指出,这些提升在真实页面加载中可能难以感知(微秒级优化),主要收益体现在内存占用减少。因此,性能数字更适合作为缓存压力测试的参考,实际效果需结合自身负载评估。

Q&A

Yac 2.4.0 相比 2.3.1 在小值读取性能上提升了多少?

根据基准测试,小值(内嵌)读取性能提升了 64%,从 3.9M ops/s 提升到 6.3M ops/s。

Yac 2.4.0 的 Embedded values 机制是什么?

Embedded values 是 Yac 2.4.0 引入的优化,将 NULL、true/false、小整数、不超过 7 字节的字符串和空数组直接编码进 slot 的指针字段中,利用指针低 3 位作为类型标签,避免写入 values 区,从而减少内存分配和拷贝,提升读取性能。

Yac 2.4.0 中 get() 方法的 $default 参数有什么作用?

$default 参数用于区分缓存未命中和缓存值为 false 的情况。当未命中时,返回 $default 指定的值;如果缓存值本身就是 false,则返回 false。例如,$yac->get('missing', []) 在未命中时返回 [],而 $yac->get('missing', false) 在未命中时返回 false。

Yac 2.4.0 的 dump() 方法新增了什么功能?

dump() 方法新增了 $offset 参数,支持分页获取缓存条目,例如 $yac->dump(100, 500) 表示从第 500 条开始取 100 条。同时,每个条目增加了元信息,包括 hits(命中次数)、atime(最近访问时间)、c_len(压缩后长度)和 embedded(是否内嵌),便于分析缓存使用情况。

Yac 2.4.0 为什么用 LZ4 替换 FastLZ?

因为 FastLZ 库太老且维护不活跃,而 LZ4 解压速度更快、压缩率更好、维护活跃。替换后,压缩值的读取性能提升了约 3.5 倍(从 1.0M ops/s 提升到 3.6M ops/s)。

Yac 2.4.0 在 WordPress 缓存场景下内存占用有何改善?

实际测试中,Yac 的内存占用从 23.5M 降至 12.4M,主要得益于 Embedded values 机制,空数组等小值不再占用 values 内存,Recycles 也降为 0。

如何为 WordPress 配置 Yac 的内存大小?

建议 keys 内存按不同 key 数量的 2 倍估算,values 内存按热数据装满一轮再留 50% 余量。对于普通博客,8M keys + 32M values 通常足够。也可以简单按 values = 4 倍 keys 来设置。

🏷️

标签

➡️

继续阅读