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

时间:2022-12-12 13:20:47

之前的文章中我们已经学习过一个 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

PHP的另一个高效缓存扩展:Yac的更多相关文章

  1. Android:一个高效的UI才是一个拉风的UI(二)

    趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死 ...

  2. PHP 缓存扩展opcache

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  3. SmartWiki开发日记之Laravel缓存扩展

    SmartWiki简介请阅读: http://www.cnblogs.com/lifeil/p/6113323.html 因为SmartWiki的演示站点部署在阿里云上,阿里云有一个128M免费的Me ...

  4. LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载

    LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载 2014/11/27 教程笔记 4,743 14     WordPress 精品主机推荐:恒创主机 | 阿里云(本站目前所用云主机) 倡萌 ...

  5. php的opcache缓存扩展

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  6. php的opcache缓存扩展&lpar;php页面代码刷新速度&rpar;

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  7. 如何创建一个Edge 浏览器扩展

    随着微软Windows 10 年度更新的发布,数次延宕的Edge 扩展功能终于得到了官方正式支持.我在我的另外一个博客上发布了如何创建一个Edge 浏览器扩展的博文,链接如下: https://blo ...

  8. 成为一个高效的web开发人员,只需要三步

    想成为一名专业的web开发人员并不像你想象的那么容易,开发人员在开发自己的web项目时常常需要牢记很多东西,他们要不断寻找新理念,新创意,在特定时间内开发出高质量的产品,一名优秀的程序员必须明白时间的 ...

  9. C&num;获取一个文件的扩展名

    C#获取一个文件的扩展名System.IO.Path.GetExtension( "文件名 ");ChangeExtension   更改路径字符串的扩展名. Combine   ...

随机推荐

  1. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  2. PHPExcel 大数据的导出

    PHPExcel 是一个php语言读取导出数据.导入生成Excel的类库,使用起来非常方便,但有时会遇到以些问题,比如导出的数据超时,内存溢出等. 下面我们来说说这些问题和解决办法. PHPExcel ...

  3. java的poi技术读取Excel&lbrack;2003-2007&comma;2010&rsqb;

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...

  4. ASP&period;NET Web API 控制请求频率

    参考地址:http://www.cnblogs.com/shanyou/p/3194802.html 安装nuget包:WebApiContrib 很多的api,例如GitHub’s API 都有流量 ...

  5. HDU 4884 TIANKENG’s rice shop (模拟)

    TIANKENG's rice shop 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/J Description TIANKE ...

  6. StrutsPrepareAndExecuteFilter&lpar;转&rpar;

    http://www.iteye.com/topic/829843  一.概述 Struts2的核心是一个Filter,Action可以脱离web容器,那么是什么让http请求和action关联在一起 ...

  7. XAML 名称范围

    XAML 名称范围存储 XAML 定义的对象名称和它们的对等实例之间的关系.此概念类似于其他编程语言和技术中的术语名称范围的更广泛的含义. 定义 XAML 名称范围的方式 XAML 名称范围中的名称使 ...

  8. python手记&lpar;27&rpar;

    #!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test2.jpg" ...

  9. compile php with openssl on mac osx error 填坑

    从源码手动编译 PHP 时出现如下错误:           Default   1 2 3 4 5 6 7 8 9 10 11 12 13 14 Undefined symbols for arch ...

  10. MySQL在线大表DDL操作 (转)

    http://www.cnblogs.com/janehoo/p/5382474.html 线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 ...