跳转到正文

缓存

storh 内置轻量缓存后端,无需运行时依赖:

PHP
use Storh\Cache;
use Storh\CacheValidation;

$docs = new Storh\DocStore($root, 'pages', cache: Cache::memory(maxEntries: 10000));
$docs = new Storh\DocStore($root, 'pages', cache: Cache::apcu('storh.pages'));
$docs = new Storh\DocStore(
    $root,
    'pages',
    cache: Cache::memory(maxEntries: 100000, maxBytes: 96 * 1024 * 1024),
    cache_validation: CacheValidation::TRUST
);

缓存层:

  • 已解码的 DocStore 记录
  • 缺失记录的负查找结果
  • 分段日志清单
  • 稀疏分段索引

验证模式:

  • CacheValidation::STAT:验证是否存在、修改时间和大小。
  • CacheValidation::HASH:验证是否存在、修改时间、大小和内容哈希。
  • CacheValidation::TRUST:缓存命中时跳过文件系统验证,并信任当前的 storh 实例或共享缓存后端会发布显式的 storh 写入。

STAT 是默认的快速验证模式。如果每次缓存命中都必须验证文件内容,包括修改时间未变但内容大小相同的写入,请使用 HASH。STAT 无法检测同时保留修改时间和大小的外部内容更改。对于单进程或共享缓存工作负载,TRUST 是最快的模式;它有意不检测在 storh 之外更改的文件。

Cache::memory() 同时受条目数量和字节数限制。如果未提供 maxBytes,则会根据 PHP 的 memory_limit 推算预算。

Cache::apcu() 是可选项。如果当前 SAPI 无法使用 APCu 或已将其禁用,它会作为空操作后端运行。

何时挂载缓存后端

DocStore 始终会为已读取或写入的记录保留小型实例内缓存,并按配置的模式进行验证。挂载后端会添加一个生命周期超出实例的缓存:对于会重新打开存储的长时间运行进程,Cache::memory() 很有帮助;Cache::apcu() 则可在多个 PHP-FPM 请求之间共享已解码记录。基准测试测得,内存后端的冷读取耗时约为 83 µs,而经过 STAT 验证的热缓存命中耗时约为 6 µs。