您的位置:首页 > 编程语言 > PHP开发

PHPCMS 中 cache_count() 函数的作用

2012-04-22 12:21 169 查看
原先我不明白 cache_count 有什么作用,现在谈谈它的用法。

cache_count() 函数第一次看到是在 PHPCMS2008 中,作用是缓存一条 COUNT(*) SQL 查询的结果,如:

cache_count("SELECT COUNT(*) AS count FROM ...")

有一次在写一个后台分页功能时,统计 COUNT(*) 总数的查询使用了 cache_count 做缓存,但在测试分页功能时发现分页无效,本来应有第二页的,但分页结果却还是只有一页。原来是因为统计的查询语句被 cache_count 缓存了且缓存有效期还未过,因此分页结果还是原来的一页。

当时我断定,cache_count 既影响测试又没用。

但是我错了,想象一下:

总共有 88331 条记录,每页显示 20 条,共 4417 页。列表页是前台页面,假设有 10 个并发访问,每个都访问不同的页数,比如 1, 3, 5 页。

于是我发现, COUNT(*) 的结果实际上是一样的,无论是第 1 页,还是第 1000 页,只要数据不变, COUNT(*) 也不会变。实际上,当页数大于 1000 页以后,那怕每天增加 100 页左右的记录数,由于增加的记录是排在前面的,今天的页数到底是 4417 还是 4517 一点关系都没有——根本不会有真正的用户会去看第 4500 多页的数据。

设现在统计 COUNT(*) 需要用时 0.1(s) ,每天列表页会被访问 100 次,那么, COUNT(*) 总用时为 0.1*100 = 10(s) ——花 10(s) 去取 100 个相同的结果!

所以要用 cache_count ,缓存有效期为 1 天。于是,无论今天列表页被访问多少次,都只需执行一次 0.1(s) 的统计,后面每次读取缓存只需用时约 0.0002(s) 。

访问次数越多,节省的时间就越多。

这就是 cache_count 的作用。

所以,列表页都可以用 cache_count() ,唯一需要注意的只是根据数据量的不同设计不同的缓存有效期。

PHPCMS cache_count() 的缓存有效期用常量定义,这不方便灵活地控制每条查询的缓存有效期,所以我把缓存有效期也加入为 cache_count 的参数,原形如下:

cache_count($sql, $timeout = 默认缓存有效期)

%%

# 历史

2011-10-14 初稿,包含 cache_count() 及 page_select() 两个函数的说明。

2012-04-22 删除 page_select() 函数的说明,只说明 cache_count() 函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: