# 多级智能缓存(静态化)机制

缓存系统的设计,直接决定了系统的运行效能。就像我们下了一个订单,送货方如果从悉 尼发货和同其在上海的仓库发货相比,速度完全是两个等级。缓存的设计就在于一个“就近原 则”。将数据靠近使用者。

ECOS的前端站点组件site, 对缓存有着极为精细的把控,完全发挥现代浏览器和HTTP协 议的性能。

ECOS的site有3层缓存结构,按顺序触发:

 层次 缓存名称 存放位置
 1 基于http协议的浏览器缓存 用户浏览器本地
 2 前台全页缓存 kvcache
 3 末班缓存 kvstore











# 基于http协议的浏览器缓存

现代浏览器都很聪明,他们尽量不会把同样的数据从网上下载两次。但是只有同样聪明的服务器程序才能给予配合。

如果用户访问过这个网站,那么ECOS-site会在系统的header头里放一个Etag标签。 这个Etag数据是和页面的内容相关的,如果页面内容变了,Etag也会不同。

这个过程被写在RFC2616文档中:

http://tools.ietf.org/html/rfc2616 ECOS-site有一个完整的实现 , 流程如下:

而 ECOS-Site 有一个完整的实现, 流程如下图所示:

# 服务器端缓存设计

现在聚焦到上图中"生成页面内容..."这个环节中, 此时系统并不是为每次生成页面内容的 请求都重新运行一次, 而是将页面的结果整体缓存下来,如果该页面所包含的数据都没有更新, 则是直接输出被缓存下来的内容。

ECOS-site在数据库的操作底层设置了一个触发动作,当有任何表的更新,插入,删除操 作时,将当时的时间和被操作的表明记录在一个特殊的表里: sdb_cachemgr。例如某时刻该表 的数据如下:

 表名 最后时间
 sdb_goods 2009-11-21 16:20:26
 sdb_goods_cat 2009-11-20  05:25:21
 sdb_setting 2009- 11-23 19:40:13
 sdb_member 2009-11-23 08:36:23
 sdb_order 2009-11-22 20:46:20
 sdb_payments 2009-11-24 05:20:27
 ... ...

实际上,真实系统里表的时间都是unix时间戳格式,那个数字的意思是1970-01-01 00:00:00之后 的秒数。在这里,为了方便理解,我们在此用实际时间表示。

在处理前台请求时,数据库底层会记录在这个过程中用到的数据表,包括页面挂件,流程 插件,自动机器人,模块,以及各种子流程。 同时会记录用到的修改时间,存到最终生成的缓存 条目头部。

假设过了5分钟,又有人访问同样的网址,系统发现存在针对这个url的缓存。 此时会读出 这个缓存条目用到的表名列表: sdb_goods,sdb_goods_cat,sdb_setting 并到 sdb_cachemgr中检查这些表当前的状态,如果发现有以上表里有任何一个在上次缓存保存之后 被修改过了,则宣布该缓存作废, 重新生成页面。

而这个过程是在core/include/cachemgr这个类 管理的。

最后更新: 8/17/2018, 5:38:02 PM