相关的YII类:

CActiveRecord

CActiveRecordBehavior

cache

Active Record

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

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

beforeValidate 和 afterValidate: 在一个表单提交动作触发的基于AJAX的验证执行之前和之后被调用的函数(仅当validateOnSubmit设置为true时可用)。

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
{
//......
//.....
}

From: http://www.yiibase.com/yii/view/172.html

Yii 的AR单行数据自动缓存机制的更多相关文章

  1. day06 内存地址 小数据池缓存机制

    1. 内存相关 示例一 v1=[11,22,33] v2=[11,22,33] #值相等 内存地址不等 v1=11 v2=11 #按理说内存地址应该不等,但是python为了优化使其内存地址相等 v1 ...

  2. Yii框架AR对象数据转化为数组

    demo函数作用:将AR对象数据转化为数组 局限:仅用于findAll的多维数组,find一维数组可以先转化为多维数组的一个元素在使用 function actionIndex() { $data = ...

  3. jquery源码解析:jQuery数据缓存机制详解2

    上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...

  4. Java的自动拆装箱与Integer的缓存机制

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10832303.html 一:基本类型与包装类型     我们知道,Java有8大基本数据类型,4整2浮1符1 ...

  5. python的代码块缓存机制,小数据池机制。

    同一代码块的缓存机制 在python中一个模块,一个函数,一个类,一个文件等都是一个代码块. 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其 ...

  6. day3:强制类型转换&自动类型转换&变量缓存机制

    1.Number的强制类型转换(int,float,bool,complex) 1.int 强制转换成整形 float可以转化成int bool可以转化成int str(形如"123&quo ...

  7. day3 python数据类型转换及变量的缓存机制

    类型转换 1,强制类型转换 1.1 number的转换(int,float,bool,complex) num1 = 10 num2 = 10.6 num3 = True num4 = 3 + 4j ...

  8. Python 小数据池和代码块缓存机制

    前言 本文除"总结"外,其余均为认识过程:3.7.5: 总结: 如果在同一代码块下,则采用同一代码块下的缓存机制: 如果是不同代码块,则采用小数据池的驻留机制: 需要注意的是,交互 ...

  9. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

随机推荐

  1. Nginx常用伪静态规则(rewrite)-Discuz X3.2-WordPress-PHPCMS-ECSHOP-SHOPE(转)

    当我们从apache服务器转向Nginx服务器的时候,它们的伪静态规则就不一样了,所以你熟悉Nginx服务器的伪静态规则,自己写当然也好.不了解Nginx服务器的伪静态规则的,为方便各位站长,收集了这 ...

  2. 学习PHP爬虫--《Webbots、Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)》

    <Webbots.Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)> 译者序 前言 第一部分 基础概念和技术 第1章 本书主要内容3 1.1 发现互联网的真 ...

  3. 对 HTTP 304 的理解(转)

    最近和同事一起看Web的Cache问题,又进一步理解了 HTTP 中的 304 又有了一些了解. 304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供 ...

  4. mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句

    http://blog.csdn.net/qkxh320/article/details/16115671 1.首先操作mongodb最基本命令:: show databases;           ...

  5. lucene解决全文检索word2003,word2007的办法

    在上一篇文章中 ,lucene只能全文检索word2003,无法检索2007,并且只能加载部分内容,无法加载全文内容.为解决此问题,找到了如下方法 POI 读取word (word 2003 和 wo ...

  6. QQ宠物吹泡泡游戏小助手 VC++6.0代码分析

    最近玩QQ宠物,他总是心情低落,让我很不爽,让他玩耍吧,还得自己点鼠标,所以想偷个懒,试试能不能编个程序让电脑帮我做这个事情. 要干这件事就得先找一个游戏开刀,刚开始我找的是弹力球游戏,不就是点鼠标么 ...

  7. .NET笔试题(关于迭代的:遍历XML中的FileName)

    一.使用迭代算法,遍历XML文件中所有的文件名 写一个函数返回文件名集合 在主函数中调用该方法: 以后有关迭代的都写到这儿

  8. 在开发项目中有些常用的的实用代码(ps:平时看着无关紧要的,却很容易忘记)

    1,在客户端使用Cookie document.cookie = "key=1"; document.cookie = "name=zhangsan"; coo ...

  9. Linux技术修复

    今天在慕课网上学习了Linux的一些知识: 我使用命令: ***:~$ route add default gw 192.168.1.1 添加了一个网关:192.168.1.1之后的结果为: ***: ...

  10. Windows XP系统安装SQL Server 2005(开发版)图解

    转自Windows XP系统安装SQL Server 2005(开发版)图解 安装前提:由于有些从网上的下载的项目需要导入SQL Server 2005的数据文件,因此,今天便安装了这个数据库,我的系 ...