比如现在是个软件下载站
像"最多下载","最新下载","最多评论"等页面局部上的区域我做成了widget
这样就可以随意在页面上插入这些widget,并且定义了title作为标题,num作为显示数量
现在要针对这些widgets做缓存?
用什么缓存方式呢?
页面局部缓存不行,因为我在CWidget::run函数中做了sql查询,这样的话无论如何都会执行sql语句
widget又无法像CController那样用CoutputCache的filter形式做缓存
只有在run函数中写数据缓存么?
那这样我就要根据$title和$num来生成缓存key的规则?
感觉CoutputCache用作页面局部缓存的时候我感觉有点怪异
因为sql数据获取是在Controller或者model中,
而view中如果用CoutputCache那么就要在view中写sql查询.
可能我对mvc+缓存的理解有偏差,各位是什么看法?
clhqk
(cuileon)
3
在controller或model判断缓存ID,如果有缓存就不再查询!
你指的是1.17版本中的
$rows = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();
这种用法么?
这个确实很方便.
这样的话那就是说所有的都用数据缓存和整页缓存这两种?
页面局部缓存几乎不用(破换mvc的原则).
...other HTML content...
<?php if($this->beginCache($id)) f ?>
...content to be cached...
<?php $this->endCache(); g ?>
...other HTML content...
这种缓存方式我实在想不到会在什么情况下用到
clhqk
(cuileon)
8
比如在controller里有一个控制查询的话句,可以通过这个cache id判断是否再进行查询!
我感觉这样代码不是很简洁,controller中要做缓存判断,view要做相同的缓存判断,而且在cache的id多了之后,不好对cache的id进行管理,
不如1.17的那个新的db query cache来的完美,连缓存判断也不用写了.
上次我写的一个网站各种形式缓存,各种缓存id,把自己都搞晕了.
感觉缓存的整体设计也是一门学问,又要方便管理,又要方便写代码
clhqk
(cuileon)
10
我这种方法估计也不是你想要的答案,因为考虑到页面缓存根本就控制不了controller或model里的查询过程,所以必须通过view的缓存标记去判断是否重新查询,我一般用CoutputCache没有考虑controller或model的查询,但是如果查询的工作比较大的话,这确实是个问题。
期待解决方案!
clhqk
(cuileon)
11
这种方法最好,但是和view的缓存不同步,如果同时设置好缓存时间,用这种方法是最好的!
lygmqkl
(Lygmqkl)
12
我想能不能这样处理,缓存数组,简单的说 最多下载,就算你显示的数量不同,但是范围一定是0-30之间,那么你就一次读取30条最大值 缓存之,然后 渲染的时候自己切断,这样是不是更容易?而且不会造成很多数据浪费。
你说的正是我最近相当纠结的问题,
对于榜单一类的数据,比如"最多下载",在这个页面区域可能显示10条,另一个页面区域只显示5条,现在网站上有很多这样的榜单.
1.如果用了yii的query cache,代码就简单了,
但是清空缓存第一次运行时,会执行两条sql,一次limit 10,一次limit 5,并且2个缓存文件占用了较多的磁盘空间
2.如果自己写个缓存,那很多函数都会出现缓存判断,很多重复代码,而且要自己去管理缓存key命名规则,保证不重复:
public function getMostDownloads($limit,$cacheTime){
$value = Yii::app()->getComponent('cache')->get('最多下载榜单');
if ($value === false) {
$value=获取前50条榜单数据;
Yii::app()->cache->set('最多下载榜单', $value,$cacheTime);
}
根据$limit返回$value的相应条数
}
想了一下,还是用db query cache,方便代码管理.
仅仅是limit切断数组倒是简单
如果涉及到了排序,难道还要处理排序
如果涉及到了表连接,某些查询需要连接(),某些查询不需要,就更纠结了
litcor
(Littlecor)
15
才发现1.1.7多了db query cache~~不错
Guy
(Asersz)
16
定义一个模型比较合适. 永远缓存最大数. 比如 5 10 15 20. 永远缓存20. 一个类完全够了吧. 逻辑也不复杂. 有更大量的数据请求和数据过期时重载缓存.
lygmqkl
(Lygmqkl)
17
我也觉得就算你缓存Query 最后也是缓存result,直接缓存得到的数组不就好了?