CDbCacheDependency关于复杂的sql

本文探讨了在Yii框架中使用CDbCacheDependency时的最佳实践,重点介绍了如何通过使用AVG而非MAX函数来提高缓存的有效性和准确性。此外,还讨论了在数据删除时缓存可能遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CDbCacheDependency关于复杂的sql


写CDbCacheDependency的sql时的原则是:这条sql必须是轻量级的,因为他在每次读取cache时都会执行一遍他。

一般写CDbCacheDependency的sql时习惯用
$dependecy = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_question');

$dependecy = new CDbCacheDependency('SELECT AVG(update_time) FROM tbl_question');

注意:用avg代替max的好处是可以判断出删除时的变化。

原文如下:
I remember now why you should use AVG and NOT MAX.
If you have something like:
$dependency=new CDbCacheDependency('SELECT MAX(last_updated) FROM {{post}}');
$criteria=new CDbCriteria;
$criteria->order='post_id DESC';
$models=self::model()->cache(1000,$dependency)->findAll($criteria);
foreach($models AS $model){
echo $model->title;
}
And let's say the above query returns 10 models, all 10 models will be cached for the next requests, but if you delete one of those 10 records from the database (not the last updated one, on which the depenency is created on by using MAX()) then in frontend you will still receive 10 models, when in fact the cache should invalidate and you should retrieve 9 models.

注意:可以用CGlobalStateCacheDependency 代替CDbCacheDependency,可以用CGlobalStateCacheDependency 来存储last create, update or delete time of a table in a global state, 然后用他来检验dependency 的变化,不过这样容易出错

参考:http://www.yiiframework.com/forum/index.php?/topic/11394-cdbcachedependency-and-cactivedataprovider/
http://www.yiiframework.com/forum/index.php/topic/33449-cdbcachedependency-subsequvent-calls/page__p__161165#entry161165‘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值