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;
    }

这样就实现了缓存路径的设置和恢复,这样这个缓存就可以在任何地方被调用,也不会出现缓存路径混乱的问题。

思路总结

  1. 熟悉现有项目框架解决问题的思路,不要总重复的底层劳动,实现业务更重要
  2. 解决一个问题更大概率会导致另一个问题,需要我们再去解决
  3. 善于归纳的人进步更快

以上是关于PHP精讲2021—Yii2框架项目中的缓存Cache组件实际应用以及分析问题思路的主要内容,如果未能解决你的问题,请参考以下文章

PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点

PHP精讲2021—从Yii2源码Response看web响应考察哪些知识点

PHP面试题精讲—从Yii2源码ActiveForm看如何安全处理表单验证

PHP面试题精讲—从Yii2源码ActiveForm看如何安全处理表单验证

高可用高性能yii2.0

PHP面试题精讲—2021—时间日期格式化在实际项目的应用