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. 持久状态:对象经过 ...
随机推荐
- H-UI的前端处理验证,判断是否已经存在,比较健全的模板,可以自己添加一些校验
<input type="text" class="input-text" value="${detail.supportingname }&q ...
- Sencha Touch Guide
1.一些命令 创建APP # Make sure the current working directory is the Sencha Touch 2 SDK 例如D:\Program File ...
- django之JavaScript的简单学习2
前言:ajax预备知识:json进阶 1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javascript对象: 请大家记住一 ...
- 【python】三个变量互换值
>>> x = 1>>> y = 2>>> z = 3>>> y3>>> z1 大写的帅字! (来自小甲鱼习题 ...
- Scala的Option类型
Scala的Option类型 为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型.在没有值的时候,使用No ...
- linux的fork函数
fork函数 头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include< ...
- Quartz2D 备忘 + 学习
Quartz2D Quartz2D是支持iOS和Mac系统的二维绘制引擎,它可以绘制: 绘制图形(图形,线条,圆等) 绘制文字 绘制/生成图片 读取/生成PDF 截图 Quartz2D主要功能就是以画 ...
- UIWebView1-b
随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...
- lua之mysql编程
环境搭建 #mysql 安装 sudo apt-get install mysql-server mysql-client # lua mysql 开发驱动安装 sudo apt-get instal ...
- Hbase热点问题
需求描述:扫描(查询)某个区间--->列用hbase多节点的资源,分布式扫描,加快速度==> 然后拼接到一起 如何打散数据 冠字号逆序,hash 并不一定数据连续就会造成热点,这个是由数据 ...