六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 52|回复: 0

缓存同步策略重构

[复制链接]

升级  72%

46

主题

46

主题

46

主题

秀才

Rank: 2

积分
158
 楼主| 发表于 2013-1-27 05:43:07 | 显示全部楼层 |阅读模式
简述一下CommonTemplate(http://www.commontemplate.org)的模板工厂每次获取模板的过程如下:

检查内存缓存中是否存在,
若不存在,则检查持久化缓存中是否存在,
若还不存在,则重新解析模板并将模板压入内存缓存及持久化缓存,
若存在,则检查是否需要热加载,
若需要热加载,则对比文件是否已更改,
若已更改,则重新解析模板并将模板压入内存缓存及持久化缓存,
返回模板

因为很多检测点,开始整个过程都被同步执行了,

huangyh讨论时,
他提出,如果去掉同步,会出现什么?
总结是:
一、在并发下,同一模板会多次被解析和缓存,
二、非同步缓存容器保存时可能出错,

讨论后发现:
第一种影响对程序的正确性没什么影响的,只是“觉得”多次解析和缓存会影响性能,
而实际上,这些影响性能比同步块对引擎活性的影响要小很多,
即然如此,那只要保证缓存容器自身是线程安全的,就没必要同步整个获取过程。

缓存容器采用的是策略模式,
引擎留出的SPI是:org.commontemplate.config.Cache接口,重构后:
第一种方式:
在Cache接口的文档中声明,Cache的实现者都必须线程安全,即自行实现同步。
第二种方式:
引擎在调用Cache之前,使用装饰器模式统一外包装实现同步。
第三种方式:
结合上面两种方式,再加一个是否需要外部同步的标识性接口,引擎基于此判断是否需要外部同步。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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