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

52次阅读

共计 3251 个字符,预计需要花费 9 分钟才能阅读完成。

之前的文章中咱们曾经学习过一个 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 a
echo $yac->a, PHP_EOL; // value a


print_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; // 10s
echo $yac->ttl2, PHP_EOL; // 20s

sleep(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

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0