【Discuz缓存机制】实现Discuz缓存机制的实时更新与自动刷新

本文为我(7u5/陈秋武)原创,欢迎转载,请保留此行或注明出处。本文以Discuz7.2版本为基础。
Discuz模板机制在config.inc.php中设置$tplrefresh为1即实现模板缓存的自动更新。

但是基于同样的原理并无法在数据缓存机制中实现。
因为数据源为数据库中数据时,cdb_caches中的dateline字段(缓存更新时间)如果每次取出作为判断标志,则会加大数据库的连接压力。

我在最近的项目中遇到类似的问题,并思索总结出了自己的解决方案,现在提出来给大家共享:
(1)在原来缓存机制的基础上建立一个缓存名字段与dateline字段对应的缓存。如cache_dateline.php。
(2)写一个getcache函数,每次加载缓存前,先载入cache_dateline.php,然后用cache_缓存名.php(如cache_7u5.php)的修改时间与cache_dataline.php缓存中的dateline值做对比。如果cache_dateline.php中的时间戳大于缓存文件cache_7u5.php的修改时间,则调用updatecache('7u5'),否则直接加载cache_7u5.php。
(3)这里就涉及到一个问题,及cache_dateline.php缓存的更新。我略微思索决定把这个步骤加入到updatecache的replace into段中,同时更新dateline缓存数据及cache_dateline.php,以便保证cache_dateline.php的缓存更新。

总体实现完以后,就可以让Discuz彻底脱离手动更新缓存,而只稍微增加一点点小负载,即在使用前判断两者修改时间,判断前加载cache_dateline.php(因为只有缓存名和dateline字段,所以大小很小,顶多几十k)。
这个项目实现,很适合于大负载的文本阅读站点中使用,因为纯静态化的空间复杂度过高,在移植维护时非常不便。
(4)大文本内容缓存的更新在这种策略的基础上,结合目录切割,类似Ucenter用户的目录切割。000/00/00,在加载之前进行文本更新判断。

posted @ 2014-02-20 15:00  念雷星  阅读(4593)  评论(0编辑  收藏  举报