Nt Discuz2.0的缓存层设计模式等亮点解析

缓存模块用的是一个策略模式

 

下面是一个简单的策略模式的示意图

我是在WORD里做一个简单的示例,没有用标准UML

 

 

策略模式:DNTCache 封装逻辑产生ICacheStrategy子类实例。

ICacheStrategy为公共策略缓存接口

ICacheStrategy几个分支表示策略接口的各种实现。

策略模式的优势在于

1 封装:Clint调用的时候只需要开放DNTCache,而对内部逻辑和结构等透明。

2 开放:需要新的策略实现,就可以新写一个实现既可。

 

DNTCache的第一个亮点在于类里有个DNTCache类型的成员变量 instance静态的,用的关键词是volatile

 

volatiledisplay/hide example sentences
KK: []
DJ: []
a.
1. (液体等)易挥发的
Gasoline is volatile.
汽油是易挥发的。
2. 易发作的;爆炸性的
The situation in that area was tense, dangerous and volatile.
该地区的局势紧张、危险,且有一触即发之势。
3. 易变的;反复无常的;轻浮的
4. 活泼的;轻快的
5. 飞逝的;短暂的
 
在这里是跨WEB园的作用,就是网站应用程序池同时使用,也不会出现所修饰的静态变量各池间不一致的状况。
 
DNTCache里的第二个亮点是用XmlDocument 做缓存映射。
每一个XmlDocument 的以处理过的xpath为键值的结点都一一和缓存对应,节点的Attribute是一个由Guid产生的objectId和一个removedatetime(上次修改时间)组成。
 
在DNTCache里,既然处理XmlDocument 也处理ICacheStrategy的子类实例。(这和代理模式比较类似,区别是DNTCache类在处理XmlDocument 的同事,也直接地处理了ICacheStrategy的子类实例,而代理模式的话是DNTCache和ICacheStrategy的子类实例无关。)
 
至于为何要做这样的映射,我也一直在思考,如果从结果上来看,把最后一次修改时间作为缓存对象的一个属性,也是可以处理的。
 
从1.1的缓存设计思路来看,因为1.1版用的是磁盘文件直接存取,所以需要写成文件形式,而XML形式又比较有利于存取。
 
第二个很大因素是便于直观,方便地控制缓存,就如上面代理模式类似,缓存策略其实更需要一个缓存列表,而不是每个缓存具体本身,就如经理分配工作,只分配到谁做哪个任务,而具体任务本身则不一定由经理分配。但是经理如果有一个所有工作的列表,就更加有利于安排和协调工作,这就是映射的优势。
 
 第一次在CNBLOG写博,希望大家批评指正。
 

posted on 2008-08-13 11:47  灯灯  阅读(572)  评论(1)    收藏  举报

导航