PHP精讲2021—Yii2框架项目中的缓存Cache组件实际应用以及分析问题思路
Posted 小雨同学的服务器果然有问题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP精讲2021—Yii2框架项目中的缓存Cache组件实际应用以及分析问题思路相关的知识,希望对你有一定的参考价值。
生活中没有弱者,仅有不愿努力的人。
前言
我们在面试过程中,总是会遇到这样的面试题,去考察大家对于缓存的理解。但是这些理解总是偏向理论化。
正所谓面试造火箭,上班拧螺丝。网上各种文章无时无刻都在告诉大家,怎么造火箭。
诚然,过不去造火箭这一步,大家也是没办法去拧螺丝的。
那么,在实际的生产项目中,如何去拧这个缓存的螺丝,我在这里记录下思路和代码,希望能给茫茫人海中的你一些思路。
缓存在实际项目中
加载方式
目前大多数的框架都是组件的形式加载缓存配置,比如Yii2中的缓存组件
文件缓存
'cache' => [
'class' => 'yii\\caching\\FileCache',
],
memcached
'cache' => [
'class' => 'yii\\caching\\MemCache',
'servers' => [
[
'host' => 'server1',
'port' => 11211,
'weight' => 100,
],
[
'host' => 'server2',
'port' => 11211,
'weight' => 50,
],
],
],
apc
'cache' => [
'class' => 'yii\\caching\\ApcCache',
],
所以,框架做的事情我们并不需要自己再去做一次,这才是重点。
不管是什么样的缓存,最后都会被抽象到cache
的方法中。
不管是什么样的缓存,最后都会通过get
或者set
进行调用。
缓存key管理
到这一步,还是回归了主题,如果拧螺丝,并且是优雅地拧螺丝。
组件都给你封装好了,我们做的就是调用,这是毋庸置疑的。
那么,最繁琐的一步,就是对缓存的key进行管理。
在实际的业务中,缓存会存在于任何需要频繁获取的地方。
比如有:
- 用户的基础信息
- 文章的详细内容
- 用户组的过期时间
推荐使用的模式是,通过一个类统一管理
const USERINFO_BASE = 'userinfo_base_%u';
用自定义的cache类中的定义常量,把业务中的缓存key都放在里面,这样就做到了缓存key的可控,我知道自己的变量都在哪里使用了,并且我知道具体的key的格式是什么样的。
缓存的调用
同理,基于对缓存key的管理,缓存的调用也需要根据具体业务再封装一层。
案例如下:
XXX是基于Yii2开发的web项目,使用的是Yii2的高级模板,运行多个网站在一个项目中,但是需要共同调用缓存。
由于不同app调用缓存组件的默认缓存路径有差别,为了保证缓存路径不会混乱,需要封装组件,在具体调用缓存后恢复原有的缓存路径。
核心代码如下
private $cache;
private $cachePath;
public function __construct($appid = 'a1')
{
$this->cache = \\Yii::$app->cache;
$this->cachePath = $this->cache->cachePath;
$this->_setCachePath($appid);
}
private function _setCachePath($appid){
if(!in_array($appid,['a1','a2','a3'])){
return false;
}
$this->cache->cachePath = \\Yii::getAlias('@'.$appid.'/runtime/cache');
}
思路详解:缓存类的构造函数默认是a1的缓存路径,如果传入参数是预期的a1 a2 a3 。那么就会默认将当前的缓存路径变更成对应的app的缓存路径。
疑问:如果我在a1调用a2的缓存,那么经过操作之后,当前实例的缓存路径就变成a2的了,这样就会导致缓存路径的混乱,如何修复这个问题呢?
修复漏洞:使用析构函数,在调用完成后垃圾回收之前,将当前的变量设置为构造函数执行的时候保存的原本的缓存路径。
public function __destruct()
{
$this->cache->cachePath = $this->cachePath;
}
这样就实现了缓存路径的设置和恢复,这样这个缓存就可以在任何地方被调用,也不会出现缓存路径混乱的问题。
思路总结
- 熟悉现有项目框架解决问题的思路,不要总重复的底层劳动,实现业务更重要
- 解决一个问题更大概率会导致另一个问题,需要我们再去解决
- 善于归纳的人进步更快
以上是关于PHP精讲2021—Yii2框架项目中的缓存Cache组件实际应用以及分析问题思路的主要内容,如果未能解决你的问题,请参考以下文章
PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点
PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点
PHP面试题精讲—从Yii2源码ActiveForm看如何安全处理表单验证