缓存方式的问题

比如现在是个软件下载站

像"最多下载","最新下载","最多评论"等页面局部上的区域我做成了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+缓存的理解有偏差,各位是什么看法?

在controller或model判断缓存ID,如果有缓存就不再查询!

db cache

额,db cache在这里怎么用,具体方法?

你指的是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...



这种缓存方式我实在想不到会在什么情况下用到

比如在controller里有一个控制查询的话句,可以通过这个cache id判断是否再进行查询!

我感觉这样代码不是很简洁,controller中要做缓存判断,view要做相同的缓存判断,而且在cache的id多了之后,不好对cache的id进行管理,

不如1.17的那个新的db query cache来的完美,连缓存判断也不用写了.

上次我写的一个网站各种形式缓存,各种缓存id,把自己都搞晕了.

感觉缓存的整体设计也是一门学问,又要方便管理,又要方便写代码

我这种方法估计也不是你想要的答案,因为考虑到页面缓存根本就控制不了controller或model里的查询过程,所以必须通过view的缓存标记去判断是否重新查询,我一般用CoutputCache没有考虑controller或model的查询,但是如果查询的工作比较大的话,这确实是个问题。

期待解决方案!

这种方法最好,但是和view的缓存不同步,如果同时设置好缓存时间,用这种方法是最好的! :rolleyes:

我想能不能这样处理,缓存数组,简单的说 最多下载,就算你显示的数量不同,但是范围一定是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切断数组倒是简单

如果涉及到了排序,难道还要处理排序

如果涉及到了表连接,某些查询需要连接(),某些查询不需要,就更纠结了

:lol: 才发现1.1.7多了db query cache~~不错

定义一个模型比较合适. 永远缓存最大数. 比如 5 10 15 20. 永远缓存20. 一个类完全够了吧. 逻辑也不复杂. 有更大量的数据请求和数据过期时重载缓存.

我也觉得就算你缓存Query 最后也是缓存result,直接缓存得到的数组不就好了?