Yii的AR单行数据自动缓存机制

68341342289776.jpg

相关的YII类:

CActiveRecord

CActiveRecordBehavior

cache

Active Record

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术。Yii DAO 可以处理几乎任何数据库相关的任务,不过对于一些基本的CRUD,YII推荐使用Active Record。

CActiveRecord 提供了几个占位符方法,它们可以在子类中被覆盖以自定义其工作流。

beforeValidate 和

beforeSave 和 afterSave: 这两个将在保存 AR 实例之前和之后被调用。

beforeDelete 和 afterDelete: 这两个将在一个 AR 实例被删除之前和之后被调用。

afterConstruct: 这个将在每个使用 new 操作符创建 AR 实例后被调用。

beforeFind: 这个将在一个 AR 查找器被用于执行查询(例如 find(), findAll())之前被调用。 1.0.9 版本开始可用。

afterFind: 这个将在每个 AR 实例作为一个查询结果创建时被调用。

缓存

缓存是用于提升网站性能的一种即简单又有效的途径。通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间。

实现代码

YiicmsActiveRecord.php 继承 CActiveRecord.php

/**
 * Base class for all active records
 * @author biner
 * @since 1.1
 * @package Yiicms.log
 *
 */
abstract class YiicmsActiveRecord extends CActiveRecord
{
    public function behaviors()
    {
        return array(
            // YII AR的事件行为
            'YiicmsActiveRecordBehavior'
        );
    }
    /**
    * 获得model的类名
    */
    public function getModelClass()
    {
        $modelclass = get_class($this);
        return $modelclass;
    }
    /**
    * 获得某行记录的缓存键值
    */
    public function getCacheKey($pk = '')
    {
        $modelclass = $this->getModelClass();
        $model_pk = $this->getPrimaryKey();
        $pk = $model_pk?$model_pk:$pk;
        $key = 'resource_'.$modelclass.'_'.$pk;
        //var_dump($key);die;
        return $key;
    }
    /**
    * 重写findByPk方法,如果缓存存在数据,则直接读取缓存
    * 在YiicmsActiveRecordBehavior中,一旦有数据更新则删除缓存
    */
    public function findByPk($pk,$condition='',$params=array())
    {
        $key = $this->getCacheKey($pk);
        //Yii::app()->cache->delete($key);
        $resource=Yii::app()->cache->get($key);
        if($resource===false)
        {
            $resource=parent::findByPk($pk,$condition,$params);
            Yii::app()->cache->set($key,$resource);
            // 因为在缓存中没找到,重新生成 $value
            // 再缓存一下以备下次使用
            // Yii::app()->cache->set($id,$value);
        }
        return $resource;
    }
}

YiicmsActiveRecordBehavior.php 继承CActiveRecordBehavior类

/**
 * Base class for all active records
 * @author biner
 * @since 1.1
 * @package Yiicms.log
 *
 */
class YiicmsActiveRecordBehavior extends CActiveRecordBehavior
{
    private $_oldattributes = array();
  
    public function beforeSave($event)
    {
        //删除缓存
        $key = $this->Owner->getCacheKey();
        Yii::app()->cache->delete($key);
  
        $attributes = $this->Owner->getAttributes();
        $this->setOldAttributes($attributes);
    }
}

Product.php 继承 YiicmsActiveRecord

/**
 * 脚手架自动生成的AR修改为继承YiicmsActiveRecord
 *
 */
class Product extends YiicmsActiveRecord
{
    //......
    //.....
}

发表评论