Yac (Yet Another Cache) est un cache de données utilisateur en mémoire partagée, sans verrou, pouvant être utilisé pour remplacer APC ou un memcached local.
Yac stocke les données en mémoire partagée, ce qui les rend visibles par chaque worker PHP de la même machine sans aucune communication inter-processus. Au lieu de verrous, Yac repose sur des mises à jour atomiques de slots et quelques sondes de collision, ce qui signifie qu'un défaut de cache ne bloque jamais une requête, et qu'une écriture concurrente peut au pire provoquer un échec de stockage ou une lecture ratée que l'appelant peut simplement réessayer.
Sans verrou ni communication inter-processus dans le chemin d'accès, une lecture est essentiellement une recherche dans une table de hachage en mémoire partagée. Yac est ainsi extrêmement rapide, avec une latence de lecture à la microseconde, et son débit peut s'adapter au nombre de workers tant que les écritures sont réparties sur plusieurs clés ; voir les » tests de performance.
Parce que Yac échange des garanties de cohérence contre vitesse et débit, il convient mieux aux données coûteuses à produire mais faciles à recréer : fragments de page, instantanés de configuration, petites réponses de service et autres caches locaux. Il ne doit pas être utilisé comme stockage faisant autorité pour des données irremplaçables.
Depuis yac 2.4.0, les petites valeurs scalaires —
NULL, booléens, la plupart des entiers (ceux qui
tiennent sur 60 bits signés dans une compilation 64 bits), chaînes jusqu'à
7 octets et tableaux vides — sont stockées directement dans le slot de
la table de hachage plutôt que dans un bloc de valeur séparé
(« valeurs intégrées »), ce qui supprime l'allocation et la copie de
bloc à chaque accès et améliore significativement les performances tout
en réduisant l'utilisation mémoire. La version 2.4.0 a également
remplacé le moteur de compression FastLZ par LZ4, rendant les lectures
compressées plusieurs fois plus rapides.
Note:
La mémoire partagée n'est visible qu'au sein d'une seule machine. Pour partager un cache entre plusieurs serveurs, utiliser un cache réseau tel que Memcached ou Redis.