Yii2.0数据库缓存依赖发布的使用理解

 对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍如下:

1、在需要缓存依赖发布的数据表新增一个update_time字段,每次添加、修改记录后都会相应改变update_time的值:

2、保证需要缓存依赖发布的数据表每次保存(包括更新操作)都能更新update_time的值:

    // 所有表model继承的基础BaseModel.php
    /**
     * @name 重写Yii2.0 beforeSave方法,达到自动更新缓存字段update_time的目的
     * @author TestMe
     * @date 2016-12-06
     * @see yiidbBaseActiveRecord::beforeSave($insert)
     */
    public function beforeSave($insert)
    {
        // 定义需要设置依赖缓存的表
        $cacheTable = [
                SysConfig::tableName(), 
                SysCodeDetail::tableName(), 
                SysMenu::tableName(),
        ];
        
        $cacheTable = array_flip($cacheTable);
        if (array_key_exists($this->tableName(), $cacheTable) && $this->hasAttribute('update_time')) {
            $this->setAttribute('update_time', time());
        }
        
        return parent::beforeSave($insert);
    }     

3、设置数据库缓存依赖:

    
  
  // 所有表model继承的基础BaseModel.php
  /**
     * @name 获取缓存数据库依赖
     * @author testMe
     * @date 2016-12-06
     * @param array $params 缓存依赖参数
     * @example
     *  1.请检查使用model对应表是否有update_time字段
     *  2.对应使用model请继承BaseModel
     *  3.调用BaseModel的getCacheDbDependency()方法
     */
    public static function getCacheDbDependency($params = [])
    {
        // 缓存依赖sql
        $dbDependencySql = self::find()->select('max(update_time)')
                                       ->where('deleted=0')
                                       ->createCommand()
                                       ->sql;
        
        // 设置缓存依赖
        $dbDependency = new DbDependency();
        $dbDependency->db = Yii::$app->components['db'];
        $dbDependency->sql = $dbDependencySql;
        $dbDependency->params = $params;    

        return $dbDependency;
    }

4、发布缓存时使用:

        // 获取缓存依赖
        $dbDependency = SysCodeDetail::getCacheDbDependency();
        $cache = Yii::$app->cache;
        // 更新缓存文件
        $result = $cache->set('SysCodeEnum', SysCode::$_enum, 0, $dbDependency);
        if (!$result) {
            return false;
        }
原文地址:https://www.cnblogs.com/itsharehome/p/8284595.html