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. 持久状态:对象经过 ...
随机推荐
- VS建立可供外部调用的MFC类DLL,C#调用MFC调用
建立MFC DLL工程.一般选共享MFC库 关键是在你生成的CPP中,添加外部调用的接口 如下,意思是将这个函数对外公开. 如果你希望对外提供类,就把这个方法做成工厂. 如果你希望对外提供MFC的窗体 ...
- js传带参数的函数
字符串: setTimeout('pageScroll(4)',100);
- 使用dynamic来简化反射实现
dynamic是Framework4.0的新特性,dynamic的出现让C#具有了弱语言类型的特性,编译器在编译的时候,不再对类型进行检查,不会报错,但是运行时如果执行的是不存在的属性或者方法,运行程 ...
- cocos2d-x笔记5: 通过jni实现C++调用Java
Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合. C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API. Ios在XCode下直接就能C++和OC混 ...
- python类的继承
继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self ...
- Word里插入表格不带左右边框
插入表格后选中,然后开始-----段落------选择右下角的边框设置,选择无左右边框.
- maven 根据不同的环境打war包-->资源文件的处理方式
发现犯的错误: 1. 指定了testResource 文件夹与resource 为同一个文件夹.导致不论在resource 里面如何过滤文件,都不起作用.资源文件本来就是共享的.不必这样指定. 2. ...
- js 模块化
http://kb.cnblogs.com/page/132461/ http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth. ...
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
http://my.oschina.net/ydsakyclguozi/blog/413822
- 【HDU4333】Revolving Digits(扩展KMP+KMP)
Revolving Digits Description One day Silence is interested in revolving the digits of a positive i ...