用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3011|回复: 4
收起左侧

首页排名怎么做比较好?

[复制链接]
发表于 2009-8-18 16:06:09 | 显示全部楼层 |阅读模式
我的网站在首页有些排行榜,比如最新图书,最热图书等。应该用什么方法实现比较好?如果每次都来次有order by的查询很费时间,专门建张表,定期更新如何?
发表于 2009-8-18 16:33:23 | 显示全部楼层
你的思路是对的。我另外给你几个我的思路,所有这样思路都应该尽量避免直接order by的出现。
1、数据库的查询缓存,CI支持
2、文本缓存,CI支持。如果你要用partial缓存,还可以用smarty
3、就是你说的这个方法,单独做一张表,定期手动更新或触发更新。
我更加偏向推荐你用缓存
 楼主| 发表于 2009-8-19 08:46:01 | 显示全部楼层
2# saturn
你说的CI文本缓存是$this->output->cache(n)这个吗?CI的文档里说可以按页来做缓存,但是又只能把它放在controller里,那么如果放在controller函数中,是缓存的function中load->view对应的页面;如果放在构造函数里,缓存controller中装载的所有页面吗?

还有数据库缓存和网页缓存的效率和消耗资源情况如何?除此之外,我也考虑首页上两个排行榜要经常刷新,另外两个不需要经常刷新,可能仅对不需要经常刷新的两个用数据库缓存更好。
发表于 2009-8-19 10:51:11 | 显示全部楼层
很有意思的一个问题,希望大家多多探讨。
1、一般是将CI的文本缓存放到对应的function里面,至于放构造函数里面,和你放在默认的index()方面里面效果一样的,不是对所有function进行缓存,要缓存必须要先触发才行;到下次的时候系统会先检查对应路径页面是否在缓存里面。CI默认的缓存是基于路径的全页面缓存,也就是说你不能对部分页面的部分内容缓存。你可以用zend cache或者是smarty来实现局部的缓存。
2、你说的资源具体指什么?当你缓存之后对IO的读取肯定会倍增,但这减轻了数据库并发的压力。
3、我觉得你说的没错,不经常更新的直接用缓存。经常更新的,不知道你具体情况如何,我的一个想法是,用AJAX实现经常更新的那部分,比如一分钟自动更新一次。虽然这并没有减轻数据库本身的压力,但是至少“骗”过了用户的眼睛。让用户感觉,这页面加载挺快的。
4、更高级的可以用memCached,这对那些租用虚拟主机的用户来说,并不实际。
发表于 2009-8-19 14:32:31 | 显示全部楼层
还是要用缓存。缓存到文件,或者缓存到内存,都是很好的方案。

本版积分规则