之前的文章中我们已经学习过一个 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缓存扩展(php页面代码刷新速度)

    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#获取一个文件的扩展名

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

随机推荐

  1. Golang语言系列-09-接口

    接口 接口的定义和实现 package main import "fmt" /* [接口] 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现 ...

  2. DVWA-全等级暴力破解

    之前写了dvwa的sql注入的模块,现在写一下DVWA的其他实验步骤: 环境搭建参考:https://www.freebuf.com/sectool/102661.html DVWA简介 DVWA(D ...

  3. 关于下载远程文件为未知文件.txt的解决方法

    本地下载文件后缀正常,服务器下载文件后缀都为.txt的解决方法: 后缀为 未知文件.txt 的原因为前端无权限获取Content-Disposition中的文件名 response.setHeader ...

  4. 简略图解:输入 url 到出现页面,浏览器做了什么?

    应该有很多前端开发人员都思考过这么一个问题:从输入 URL 到页面加载完成,中间都做发生了什么? 这个问题涉及的面非常广,每个涉及的点又很深入.从触屏/键盘如何到 CPU?CPU 如何到系统内核?如何 ...

  5. SQL 练习23

    查询男生.女生人数 SELECT Ssex,COUNT(Ssex) 人数 from Student GROUP BY Ssex

  6. python中的logging日志

    logging使用 import logging import os from logging import handlers from constants.constants import Cons ...

  7. 处理URLs

    问题 你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs. 方法 在你解析文档时确保有指定base URI,然后 使用 abs: 属性前缀来取得包含base URI ...

  8. 【java虚拟机】Java内存模型

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7518259.html 一.什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Jav ...

  9. Mybatis的分页工具

    配置拦截器插件 特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor. com.github.pagehelper.PageHelper 现在是一个特殊的 ...

  10. linux(4)----------ssh config详解

    1.概述 ~~  config为了方便我们批量管理多个ssh ~~  config存放在~/.ssh/config                 .XX代表隐藏目录 ~~  config配置语法 2 ...