<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/refs.basic.php.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'book.yac.php',
    1 => 'Yac',
    2 => 'Yac',
  ),
  'up' => 
  array (
    0 => 'refs.basic.php.php',
    1 => '影响 PHP 行为的扩展',
  ),
  'prev' => 
  array (
    0 => 'function.xhprof-sample-enable.php',
    1 => 'xhprof_sample_enable',
  ),
  'next' => 
  array (
    0 => 'yac.setup.php',
    1 => '安装/配置',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'reference/yac/book.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/book.yac.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="book.yac" class="book">
 
 <h1 class="title">Yac</h1>
 

 <div id="intro.yac" class="preface">
  <h1 class="title">简介</h1>
  <p class="simpara">
   Yac（Yet Another Cache）是一个无锁（lock-free）的共享内存用户数据缓存，可以用来替代 APC 或本地 memcached。
  </p>
  <p class="simpara">
   Yac 将数据存储在共享内存中，同一台机器上的每个 PHP 工作进程都能直接访问，无需任何进程间通信。
   Yac 不加锁，而是依靠原子的槽位更新加上少量的冲突探测，因此缓存未命中（cache miss）绝不会阻塞请求；并发写入最坏的情况也只是某次存储失败或某次读取落空，调用方直接重试即可。
  </p>
  <p class="simpara">
   访问路径上没有锁，也没有进程间通信，一次读取本质上就是在共享内存中做一次哈希查找。因此，Yac 极其快，读取延迟在微秒级；只要写入分散在不同的键上，吞吐量还能随着访问缓存的 worker 数量增长；参见
   <a href="https://github.com/laruence/yac/blob/master/README.md#benchmarks" class="link external">&raquo;&nbsp;基准测试</a>。
  </p>
  <p class="simpara">
   由于 Yac 用正确性保证换取速度和吞吐量，它最适合缓存那些生成代价高但可以轻易重建的数据：页面片段、配置快照、小型服务响应等本地缓存。不要把它用作不可替代数据的权威存储。
  </p>
  <p class="simpara">
   从 yac 2.4.0 开始，小标量值——<strong><code><a href="reserved.constants.php#constant.null">NULL</a></code></strong>、布尔值、大多数整数（在 64 位构建下能装进 60 个有符号位的整数）、最长 7 字节的字符串和空数组——直接存储在哈希槽（hash slot）里，而不是单独的值块（即“嵌入值”，embedded values）。这样每次访问都省去了值内存的分配和块拷贝，显著提升性能的同时减少了内存占用。
   2.4.0 还把压缩后端从 FastLZ 换成了 LZ4，使压缩数据的读取快了好几倍。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="simpara">
    共享内存仅在同一台机器内可见。如果需要在多台服务器之间共享缓存，请使用 Memcached 或 Redis 等网络缓存。
   </p>
  </p></blockquote>
 </div>

 







 







 







 
 








<ul class="chunklist chunklist_book"><li><a href="yac.setup.php">安装/配置</a><ul class="chunklist chunklist_book chunklist_children"><li><a href="yac.requirements.php">需求</a></li><li><a href="yac.installation.php">安装</a></li><li><a href="yac.configuration.php">运行时配置</a></li><li><a href="yac.resources.php">资源类型</a></li></ul></li><li><a href="yac.memory-management.php">内存管理</a></li><li><a href="yac.constants.php">预定义常量</a></li><li><a href="class.yac.php">Yac</a> — Yac 类<ul class="chunklist chunklist_book chunklist_children"><li><a href="yac.add.php">Yac::add</a> — 存储一个值，但不覆盖已有条目</li><li><a href="yac.construct.php">Yac::__construct</a> — 构造函数</li><li><a href="yac.delete.php">Yac::delete</a> — 从缓存中删除条目</li><li><a href="yac.dump.php">Yac::dump</a> — 导出缓存条目以便检查</li><li><a href="yac.flush.php">Yac::flush</a> — 清空缓存</li><li><a href="yac.get.php">Yac::get</a> — 从缓存中取值</li><li><a href="yac.getter.php">Yac::__get</a> — 以属性语法取值</li><li><a href="yac.info.php">Yac::info</a> — 获取缓存状态</li><li><a href="yac.set.php">Yac::set</a> — 向缓存中存储一个值</li><li><a href="yac.setter.php">Yac::__set</a> — 以属性语法存储一个值</li></ul></li></ul></div><?php manual_footer($setup); ?>