您好,欢迎访问一九零五行业门户网

详细介绍PHP的另一个高效缓存扩展Yac

本篇文章给大家详细介绍php的另一个高效缓存扩展yac。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
之前的文章中我们已经学习过一个 php 自带的扩展缓存 apc ,今天我们来学习另一个缓存扩展:yac 。
什么是 yac从名字其实就能看出,这又是鸟哥大神的作品。毕竟是 php 的核心开发人员,他的作品每次都不会让我们失望。鸟哥可以说是我们中国程序员的骄傲,他在 php 界有举足轻重的地位,大家可以自己搜索一下他的博客,虽说更新频率不高,但每篇文章都值得我们学习。
yac 是一个无锁共享缓存系统,因为无锁,所以它的效率非常高。据说 apc 的效率是 memcached 的一倍以上,而 yac 比 apc 更快。这就是它最大的特点。
相对于 memcached 或者 redis 来说,yac 更加轻量级,我们也不需要在服务器中再安装别的什么软件,只需要安装这个扩展就可以使用。对于小型系统特别是就是简单的进行数据缓存的系统来说,我们不需要复杂的数据类型,只用这种程序语言的扩展就能让我们的开发更为方便快捷。
安装的方式也非常简单,一样的在 pecl 下载安装包后进行扩展安装即可。
基本操作对于缓存相关的操作,无外乎就是添加、修改、删除缓存。不像外部缓存系统,在保存数组或对象时,php 扩展类的缓存都能直接保存这些数据类型,而不用序列化为字符串或者转化为 json 字符串,这是 apc 和 yac 的优势之一。
添加、获取缓存$yac = new yac();$yac->add('a', 'value a');$yac->add('b', [1,2,3,4]);$obj = new stdclass;$obj->v = 'obj v';$yac->add('obj', $obj);echo $yac->get('a'), php_eol; // value aecho $yac->a, php_eol; // value aprint_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) "obj v"// }
非常简单的操作,我们只需要实例化一个 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', 'new value a!');echo $yac->a, php_eol; // new value a!$yac->a = 'best new value a!';echo $yac->a, php_eol; // best new value a!
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 = new yac();$yacfirst->a = 'first a!';;$yacsecond = new yac();$yacsecond->a = 'second a!';echo $yacfirst->a, php_eol; // second a!echo $yacsecond->a, php_eol; // second a!
这段代码我们都是使用的默认的实例化 yac 对象,虽说是分开实例化的,但它们保存的空间是一样的,所以相同的 a 变量会相互覆盖。
$yacfirst = new yac('first');$yacfirst->a = 'first a!';;$yacsecond = new yac('second');$yacsecond->a = 'second a!';echo $yacfirst->a, php_eol; // first a!echo $yacsecond->a, php_eol; // second a!
当我们使用不同的实例化参数之后,相同的 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
推荐学习:php视频教程
以上就是详细介绍php的另一个高效缓存扩展yac的详细内容。
其它类似信息

推荐信息