PHP高性能缓存扩展-APCu

:-}

众所周知高性能的缓存组件有Redis和Memcached.

Redis每秒可以处理上万请求. 适合作为缓存一些热点数据. 根据二八定律 我们可以将Mysql中20%的热点数据存入Redis.

Redis存入的数据也按照二八定律,其中20%的热点中的热点数据我们可以存入程序内.当然PHP不是很好实现.好在有Swoole这种优秀的扩展出现,
但是今天的主角不是它.

下面让我隆重介绍下今天的主角 - APCu

扩展下载地址:

http://pecl.php.net/package/APCu

在PHP5版本用的是APC,PHP7之后就是APCU.它俩是同一东西.在php.ini的配置项中都以apc开头.

不过只支持FastCGI模式.PHP-CLI下会失效.需要注意!

它和Memcached很相似.只能存入key-value类型.

apcu_add('key', 'value'); // 添加数据

apcu_fetch('key'); // 读取数据

还有很多命令,我们今天只以这两条为主.

更详细的介绍和配置可以访问官网:

https://www.php.net/manual/zh/apcu.configuration.php

它的缓存生命周期是整个PHP-FPM.当重启PHP-FPM时候才会清空.也就是说可以在同一PHP-FPM环境下跨文件和跨项目的使用它.

Redis在传输数据会使用网络模型.大大增加的时间.而这也是真正高并发业务的瓶颈之一.下面我们来测试下APCu和Redis的性能差

测试的服务器: 阿里云2核4G

PHP版本: 7.2.25

首先先编写一个写入数据的程序,记得在浏览器下访问一下.

// 文件名: set_data.php
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 写入redis数据
var_dump($redis->set('a', '1'));

// 写入apcu数据
var_dump(apcu_add('aa', '1'));
?>

接着编写Redis测试文件

<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$start = microtime(true);
for($i=0;$i<100000;$i++) {
    $redis->get('a');
}
$end = microtime(true) - $start;

var_dump($end, "内容是:{$redis->get('a')}");
?>

进行10万次get操作. 结果: float(8.415806055069) string(11) “内容是:1”

下面来测试下APCu

<?php

$start = microtime(true);
for ($i=0;$i<100000;$i++) {
    apcu_fetch('aa');
}
$end = microtime(true) - $start;

var_dump($end, "内容是: ". apcu_fetch('aa'))
?>

同样10万次get操作.结果:

float(0.01537013053894) string(12) "内容是: 1"

相差500多倍! OMG!剩下的大家都懂啦~至于如何更好的使用还得靠自己.我这里只是抛砖引玉~