缓存同步策略重构

简述一下CommonTemplate([url]http://www.commontemplate.org[/url])的模板工厂每次获取模板的过程如下:

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

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

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

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

缓存容器采用的是策略模式,
引擎留出的SPI是:org.commontemplate.config.Cache接口,重构后:
第一种方式:
在Cache接口的文档中声明,Cache的实现者都必须线程安全,即自行实现同步。
第二种方式:
引擎在调用Cache之前,使用装饰器模式统一外包装实现同步。
第三种方式:
结合上面两种方式,再加一个是否需要外部同步的标识性接口,引擎基于此判断是否需要外部同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值