Nt Discuz2.0的缓存层设计模式等亮点解析
缓存模块用的是一个策略模式
下面是一个简单的策略模式的示意图
我是在WORD里做一个简单的示例,没有用标准UML

策略模式:DNTCache 封装逻辑产生ICacheStrategy子类实例。
ICacheStrategy为公共策略缓存接口
ICacheStrategy几个分支表示策略接口的各种实现。
策略模式的优势在于
1 封装:Clint调用的时候只需要开放DNTCache,而对内部逻辑和结构等透明。
2 开放:需要新的策略实现,就可以新写一个实现既可。
DNTCache的第一个亮点在于类里有个DNTCache类型的成员变量 instance静态的,用的关键词是volatile
volatile
KK: [





]
DJ: [







]

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写博,希望大家批评指正。
浙公网安备 33010602011771号