请选择 进入手机版 | 继续访问电脑版
查看: 423|回复: 0

Discuz缓存机制像模板缓存自动更新实现数据缓存自动更新

[复制链接]

595

主题

597

帖子

3065

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3065
发表于 2021-7-20 13:02:41 | 显示全部楼层 |阅读模式
Discuz缓存机制像模板缓存自动更新一样实现数据缓存自动更新,告别手动更新缓存不增加数据库压力。

帖子内容是蓄财网原创,欢迎学习!帖子以Discuz7.2版来讲解的,最新版本Discuz! X3.5缓存机制原理是一样的。
Discuz模板机制于config.inc.php中设置$tplrefresh是1即可实现模板缓存的自动更新,但基于同样的原理却无法在数据缓存机制中实现自动更新
因为数据源为数据库中数据时,cdb_caches中的dateline字段(缓存更新时间)如果每次取出作为判断标志,则会加大数据库的连接压力。

蓄财网在近期项目中碰到了类似的问题,思考并总结出了自己的解决方案,现在将“Discuz缓存机制像模板缓存自动更新一样实现数据缓存自动更新”的解决方案分享给大家:

1、在原来缓存机制的基础上建立一个缓存名字段和dateline字段对应的缓存,例如:cache_dateline.php
2、写一个getcache函数,每次加载缓存前,先载入cache_dateline.php,然后用cache_缓存名.php(例如cache_aixc.php)的修改时间和cache_dataline.php缓存中的dateline值做对比。假如cache_dateline.php中的时间戳大于缓存文件cache_aixc.php的修改时间,则调用updatecache('aixc'),否则直接加载cache_aixc.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,在加载之前进行文本更新判断。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

GMT+8, 2021-9-26 11:59 , Processed in 0.106933 second(s), 31 queries .

蓄财网 ©版权所有

© 2021 蓄财网(www.aixc.cn)

快速回复 返回顶部 返回列表