当前位置: 首页 > news >正文

静态缓存和动态缓存

今天有个朋友问我什么叫动态缓存。N年前曾经看过一篇文章,不记得叫什么了。只记得静态缓存是在写了文章过后,就生成静态页面。动态缓存是写了文章以后不生成静态页面,当有用户第一次浏览以后,才触发相关条件生成静态页面。

我朋友又问?那不是动态缓存需要更加多的判断和操作?其实是错的。动态缓存要比静态缓存先进多,至少在我看来是这样。目前绝大多数WEB程序生成静态页面,都是采用静态生成。这就是我一直不做静态缓存(生成)的原因——麻烦。

因为静态缓存,有比较严重的缺点——数据即时性。如果要保证静态页面的某些数据的即时性,也可以说同步更新,就必须执行大量操作,统计,重新写入。或者是改变内容后,还要重新生成。如果不注重即时性,那也要定期重新更新所有静态文件。因此,在后台和前台都必须要有代码来执行更新和写文件的操作。

我说动态缓存就比静态缓存,先进就先进在生成是触发式的,这样可以让后台部分少去了很多操作。比如写完文章后,不生成静态页面,有用户第一次访问时,检查是否有缓存过的记录或者缓存文件是否存在。没有,就生成,这次操作稍微慢点,然后记录一下,第2个用户访问时,系统检查到有缓存的记录。就直接调用缓存文件。这次的速度就快了。对数据库的访问也就减少了。我们还可以给缓存设置一个有效期,当前台用户浏览时,可以触发是否更新。更新的话,这个用户浏览肯定会稍微慢点。但是第2个用户就又快了。又可以看到新内容了。后台干预的操作也大大减少了。当然,管理员可以有时间去喝咖啡了。


比如SABLOG-X要加入动态缓存的功能那我们就要多加几个字段来记录某些信息。

lastvisit 最后访问时间
cached 是否已经缓存 默认0

新文章,cached当然为0了。第一个用户访问,然后就开始生成文件,处理数据库的信息是个漫长的过程,可能也就0.00N秒吧。呵呵。生成完毕后,更新cached的值为1,然后跳转到/cachedir/datedir/articleid.html。

当第2个用户访问,查询到cached的值是1,就直接跳转或者调用/cachedir/datedir/articleid.html,就跳过了下面对数据库的操作。当然,之中可以加入缓存有效时限的判断操作,看看lastvisit和当前时间的间隔。这个间隔可以在后台设置,比如1天,2天……如果大了。就把缓存删除。再生成。如果小了。继续调用缓存文件或者跳转。反正用不了几毫秒。这一步也可以在后台批量操作。反正代码也简单。总之操作要比静态缓存简单得多。代码量肯定也要少得多。

这下就不用和朋友解释这么多了,说这么通俗。再笨都懂了。不知道有没有高手的思路或者方法更加好的。欢迎交流交流。




最近学习了不少东西,本来如果不预定51发布SABLOG-X的,就可以加入更加多的重大改进。但是为了不跳票。只能将就咯。我脸皮比较厚,敢说现在的SABLOG-X在国产BLOG中,也算排得比较靠前的了。哈哈。

BY angel

 

 

http://blog.sina.com.cn/s/blog_48edd404010003t7.html

相关文章:

  • 编解码-java序列化
  • 富文本控件
  • RAID 详解
  • magento 重写controller、model、block
  • JS for循环 闭包
  • iOS开发UI篇—CAlayer层的属性(转摘)
  • 微软职位内部推荐-Sr SDE
  • 1 - Static Template
  • java jar bat 运行
  • 快递接口——调用分析对比
  • FormsAuthentication实现登录(转)
  • php实现微信推广海报代码示例
  • WPF老矣,尚能饭否——且说说WPF今生未来(下):安心
  • 2016第51周四外甥女走丢记
  • 如何通过包名知道是否应用已经在应用商店上线
  • 《深入 React 技术栈》
  • express如何解决request entity too large问题
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 如何实现 font-size 的响应式
  • 少走弯路,给Java 1~5 年程序员的建议
  • 数据科学 第 3 章 11 字符串处理
  • 移动端 h5开发相关内容总结(三)
  • 在weex里面使用chart图表
  • 整理一些计算机基础知识!
  • ​你们这样子,耽误我的工作进度怎么办?
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (ZT)一个美国文科博士的YardLife
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)激光线扫描-三维重建
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET框架设计—常被忽视的C#设计技巧
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .sh
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /proc/vmstat 详解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Repository 注解
  • @SentinelResource详解
  • @test注解_Spring 自定义注解你了解过吗?
  • @拔赤:Web前端开发十日谈
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [ActionScript][AS3]小小笔记
  • [APUE]进程关系(下)
  • [AutoSar]BSW_Com02 PDU详解