当前位置: 首页 > 后端技术 > PHP

另一个PHP的高效缓存扩展:Yac

时间:2023-03-29 22:39:02 PHP

在上一篇文章中,我们学习了PHP自带的扩展缓存Apc。今天我们来学习另一个缓存扩展:Yac。Yac是什么其实从名字就可以看出,这是鸟哥的又一部作品。他毕竟是PHP的核心开发者,他的作品每次都没有让我们失望。鸟哥可以说是我们中国程序员的骄傲。他在PHP世界中有着举足轻重的地位。你可以自己搜索他的博客。虽然更新频率不高,但每篇文章都值得学习。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=新标准类;$obj->v='objv';$yac->add('obj',$obj);echo$yac->get('a'),PHP_EOL;//值aecho$yac->a,PHP_EOL;//值aprint_r($yac->get('b'));//数组//(//[0]=>1//[1]=>2//[2]=>3//[3]=>4//)var_dump($yac->get('obj'));//对象(stdClass)#3(1){//["v"]=>//字符串(5)"objv"//}非常简单的操作,我们只需要实例化一个Yac类,然后我们就可以通过add()方法和get()方法添加和获取缓存内容了。Yac扩展还覆盖了__set()和__get()魔术方法,因此我们可以直接通过操作变量来操作缓存。接下来我们可以通过info()函数查看当前缓存的状态信息。print_r($yac->info());//数组//(//[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;//新值a!$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());//数组//(//[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实例就相当于放在了不同的namespace中,同一个Key在不同空间的缓存不会互相影响。$yacFirst=newYac();$yacFirst->a='firsta!';;$yacSecond=newYac();$yacSecond->a='seconda!';echo$yacFirst->a,PHP_EOL;//第二个a!echo$yacSecond->a,PHP_EOL;//第二个!这段代码我们都使用了默认实例化的Yac对象,虽然它们是单独实例化的,但是它们节省的空间是一样的,所以相同的a变量可以互相覆盖。$yacFirst=newYac('first');$yacFirst->a='firsta!';;$yacSecond=newYac('second');$yacSecond->a='seconda!';echo$yacFirst->a,PHP_EOL;//首先一个!echo$yacSecond->a,PHP_EOL;//第二个!当我们使用不同的实例化参数时,同一个a不会互相影响,它们存放在不同的空间中。也就是说,Yac会自动给这些Key加上前缀。缓存老化最后,缓存系统会对缓存内容进行时间限制。如果指定了过期时间,则缓存的内容将在指定时间后过期。$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;//20sttlcache上面代码中只设置了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.phphttps://www.laruence.com/2013/03/18/2846.htmlhttps://www.cnblogs.com/sunsky303/p/6554888.html各媒体平台均可搜索【硬核项目经理】