Introduction
Yac (Yet Another Cache) is a lock-free, shared memory user data cache,
and can be used to replace APC or local memcached.
Yac stores data in shared memory, which makes it visible to every PHP
worker of the same machine without any inter-process communication.
Instead of locking, Yac relies on atomic slot updates plus a few
collision probes, so a cache miss never blocks a request, and a
concurrent write can at worst cause a failed store or a missed read
that the caller can simply retry.
With no locks and no inter-process communication in the access
path, a read is essentially a hash lookup in shared memory. As a
result, Yac is extremely fast, with microsecond-level read
latency, and its throughput can scale with the number of
workers as long as writes are spread across keys; see the
» benchmarks.
Because Yac trades correctness guarantees for speed and throughput,
it is best suited for data that is expensive to produce but easy to
recreate: page fragments, configuration snapshots, small service
responses, and other local caches. It should not be used as the
authoritative store for irreplaceable data.
As of yac 2.4.0, small scalar values —
NULL, booleans, most integers (those that fit in
60 signed bits on 64-bit builds), strings of up to 7 bytes and empty
arrays — are stored directly inside the hash slot
instead of in a separate value block ("embedded values"), which
removes the value-memory allocation and block copy on every access
and significantly improves performance while reducing memory usage.
Version 2.4.0 also switched the compression backend from FastLZ to
LZ4, making compressed reads several times faster.
Note:
Shared memory is only visible within one machine. To share a cache
across several servers, use a network cache such as Memcached or
Redis instead.