Yac 是一个无锁共享缓存系统,由于无锁,以是它的效率非常高。听说 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。这便是它最大的特点。
相对付 Memcached 或者 Redis 来说,Yac 更加轻量级,我们也不须要在做事器中再安装别的什么软件,只须要安装这个扩展就可以利用。对付小型系统特殊是便是大略的进行数据缓存的系统来说,我们不须要繁芜的数据类型,只用这种程序措辞的扩展就能让我们的开拓更为方便快捷。
安装的办法也非常大略,一样的在 PECL 下载安装包后进行扩展安装即可。

对付缓存干系的操作,无外乎便是添加、修正、删除缓存。不像外部缓存系统,在保存数组或工具时,PHP 扩展类的缓存都能直接保存这些数据类型,而不用序列化为字符串或者转化为 JSON 字符串,这是 Apc 和 Yac 的上风之一。
添加、获取缓存$yac=newYac();$yac->add('a','valuea');$yac->add('b',[1,2,3,4]);$obj=newstdClass;$obj->v='objv';$yac->add('obj',$obj);echo$yac->get('a'),PHP_EOL;//valueaecho$yac->a,PHP_EOL;//valueaprint_r($yac->get('b'));//Array//(//[0]=>1//[1]=>2//[2]=>3//[3]=>4//)var_dump($yac->get('obj'));//object(stdClass)#3(1){//["v"]=>//string(5)"objv"//}
非常大略的操作,我们只须要实例化一个 Yac 类,就可以通过 add() 方法及 get() 方法添加和获取缓存内容。
Yac 扩展还重写了 __set() 和 __get() 魔术方法,以是我们可以直接通过操作变量的办法来操作缓存。
接下来,我们可以通过 info() 函数查看当前缓存的状态信息。
print_r($yac->info());//Array//(//[memory_size]=>71303168//[slots_memory_size]=>4194304//[values_memory_size]=>67108864//[segment_size]=>4194304//[segment_num]=>16//[miss]=>0//[hits]=>4//[fails]=>0//[kicks]=>0//[recycles]=>0//[slots_size]=>32768//[slots_used]=>3//)
设置缓存
$yac->set('a','newvaluea!');echo$yac->a,PHP_EOL;//newvaluea!$yac->a='bestnewvaluea!';echo$yac->a,PHP_EOL;//bestnewvaluea!
set() 函数的浸染便是如果当前缓存 key 存在,就修正这个缓存的内容,如果不存在,就创建一个缓存。
删除缓存$yac->delete('a');echo$yac->a,PHP_EOL;//$yac->flush();print_r($yac->info());//Array//(//[memory_size]=>71303168//[slots_memory_size]=>4194304//[values_memory_size]=>67108864//[segment_size]=>4194304//[segment_num]=>16//[miss]=>1//[hits]=>6//[fails]=>0//[kicks]=>0//[recycles]=>0//[slots_size]=>32768//[slots_used]=>0//)
对付单个缓存的删除,我们可以直策应用 delete() 函数来删除这个缓存的内容。如果要清空全体缓存空间,就可以直策应用 flush() 来清空全体缓存空间。
别名空间上面我们提到了 缓存空间 这个东西。实在也便是在实例化 Yac 的时候可以给默认的 Yac 类布局函数通报一个别名配置。这样,不同的 Yac 实例就相称于放在了不同的命名空间中,相同的 Key 的缓存在不同的空间中就不会相互影响。
$yacFirst=newYac();$yacFirst->a='firsta!';;$yacSecond=newYac();$yacSecond->a='seconda!';echo$yacFirst->a,PHP_EOL;//seconda!echo$yacSecond->a,PHP_EOL;//seconda!
这段代码我们都是利用的默认的实例化 Yac 工具,虽说是分开实例化的,但它们保存的空间是一样的,以是相同的 a 变量会相互覆盖。
$yacFirst=newYac('first');$yacFirst->a='firsta!';;$yacSecond=newYac('second');$yacSecond->a='seconda!';echo$yacFirst->a,PHP_EOL;//firsta!echo$yacSecond->a,PHP_EOL;//seconda!
当我们利用不同的实例化参数之后,相同的 a 就不会相互影响,它们被存储在了不同的空间中。或者说,Yac 会自动给这些 Key 增加一个 prefix 。
缓存时效末了,缓存系统都会针对缓存内容有时效限定,如果指定了过期韶光,缓存内容就会在指定的韶光之后过期。
$yac->add('ttl','10s',10);$yac->set('ttl2','20s',20);echo$yac->get('ttl'),PHP_EOL;//10secho$yac->ttl2,PHP_EOL;//20ssleep(10);echo$yac->get('ttl'),PHP_EOL;//echo$yac->ttl2,PHP_EOL;//20s
上述代码中的 ttl 缓存只设置了 10 秒的过期韶光,以是在 sleep() 10 秒后,输出 ttl 就没有任何内容了。
须要把稳的是,对付韶光的设置,如果不设置的话便是长久有效,而且不能用 __set() 方法设置过期韶光,只能利用 set() 或者 add() 函数来设置过期韶光。
总结怎么样,Yac 扩展是不是和我们的 Apc 一样方便好用,当然,更紧张的是它的性能以及适用场景。对付小系统,特殊是机器配置不是那么强的操作环境中,这种扩展型的缓存系统能够让我们的开拓更加的快捷方便。关于无锁共享的观点我们可以参考下方参考文档中第二个链接,也便是鸟哥的文章中有详细的解释。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E9%AB%98%E6%95%88%E7%BC%93%E5%AD%98%E6%89%A9%E5%B1%95%EF%BC%9AYac.php
参考文档:
https://www.php.net/manual/zh/book.yac.php
https://www.laruence.com/2013/03/18/2846.html
https://www.cnblogs.com/sunsky303/p/6554888.html