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

相关的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单行数据自动缓存机制的更多相关文章
- day06 内存地址 小数据池缓存机制
1. 内存相关 示例一 v1=[11,22,33] v2=[11,22,33] #值相等 内存地址不等 v1=11 v2=11 #按理说内存地址应该不等,但是python为了优化使其内存地址相等 v1 ...
- Yii框架AR对象数据转化为数组
demo函数作用:将AR对象数据转化为数组 局限:仅用于findAll的多维数组,find一维数组可以先转化为多维数组的一个元素在使用 function actionIndex() { $data = ...
- jquery源码解析:jQuery数据缓存机制详解2
上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...
- Java的自动拆装箱与Integer的缓存机制
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10832303.html 一:基本类型与包装类型 我们知道,Java有8大基本数据类型,4整2浮1符1 ...
- python的代码块缓存机制,小数据池机制。
同一代码块的缓存机制 在python中一个模块,一个函数,一个类,一个文件等都是一个代码块. 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其 ...
- day3:强制类型转换&自动类型转换&变量缓存机制
1.Number的强制类型转换(int,float,bool,complex) 1.int 强制转换成整形 float可以转化成int bool可以转化成int str(形如"123&quo ...
- day3 python数据类型转换及变量的缓存机制
类型转换 1,强制类型转换 1.1 number的转换(int,float,bool,complex) num1 = 10 num2 = 10.6 num3 = True num4 = 3 + 4j ...
- Python 小数据池和代码块缓存机制
前言 本文除"总结"外,其余均为认识过程:3.7.5: 总结: 如果在同一代码块下,则采用同一代码块下的缓存机制: 如果是不同代码块,则采用小数据池的驻留机制: 需要注意的是,交互 ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
随机推荐
- <汇编语言系列>计算机硬件系统与汇编
寒假时,有幸拜读了卡内基-梅隆大学(CMU)的Randal E.Bryant 和 David R.O'Hallaron的名著——深入理解计算机系统(Computer System: A Program ...
- think ajax 应用
首先得引入 jquery 文件,另外定义一个处理的 js.js 文件 如实现用 post 传输方法: 模板文件: <script type="text/javascript" ...
- [转] HTML5终极备忘大全(图片版+文字版)---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1544 一.前言兼图片 ...
- yii2 安装
php版本必须是php5.4以上.记得配置php环境变量 1.下载https://github.com/yiisoft/yii2-app-advanced 2.php -r "readfil ...
- Yum安装Memcache
rpm -qa | grep libevent yum install libevent -y rpm -qa | grep memcached yum install memcached ...
- c#自动更新+安装程序的制作 (转)
c#自动更新+安装程序的制作 (转) http://blog.csdn.net/myhuli120/article/details/6927588 一.自动更新的实现 让客户端实现自动更新,通常做法 ...
- (转载).Net HttpPost的发送和接收示例代码
HttpPost在不同系统进行数据交互的时候经常被使用.它的最大好处在于直接,不像Webservice或者WCF需要wsdl作为一个双方的"中介".在安全性上,往往通过IP限制的方 ...
- std::copy的使用
看到有人在用std::copy这个东西,很简洁和爽啊,,所以找些帖子学习学习 http://blog.sina.com.cn/s/blog_8655aeca0100t6qe.html https:// ...
- 学习TextKit框架(上)
TextKit简介 在iOS7之前我们要实现图文混排要使用CoreText,iOS6时有了Attribute string 可以解决一些简单的富文本需求.直到iOS7 苹果推出了TextKit,Tex ...
- Android入门教程之我见
真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...