美国银行卡Payoneer注册奖励25美元

最近抽时间看了看Orchard CMS的缓存机制。我有个习惯,在看某个东西之前,会去Google下一些资料,算是自己学习,也是去看看是否有人和我一样关注某个技术点或者是某个项目等等.

image

发现有一篇文章作者是从头到尾的分析了Orchard的缓存机制,而且好像就他一个人写过这方面的内容。文章链接:

我的微软开源CMS-Orchard源码阅读之Orchard.Caching

所以如果你想对代码部分进行理解,可以去看看他的文章。真的介绍的不错,每个接口到类都分析的非常好。。。我这里不会去太多的关注整个代码的解读。先从大的方面去说说Orchard CMS的缓存为什么令我觉得非常好。

首先从大的整个项目的层面上讲,因为它完全是企业级的应用,所以整个设计是非常的复杂。这就导致了小的数据量的读写也会是显得有点慢。这就需要一个好的缓存机制了。

Orchard CMS的缓存优点我总结如下:

1.抛弃传统的传统get set方式。

2.强大的缓存过期机制。

3.优雅的代码风格

4.多级缓存的控制

 

----------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------- O(∩_∩)O  \(^o^)/~ ( ⊙ o ⊙ ) ---------------------------------------------------------------------------

如果你不知道Orchard CMS,那么试着去我上面给出的链接去了解了解。。。。

如果你了解它,甚至对它还比较感兴趣,但是还未去试着自己开发一个module,我下面会给一个CUID的例子来给你参考。

如果你对module的开发还是比较了解的,那么直接跳过下面的module开发部分,直接看下面的缓存部分介绍就OK了。。。

 

Product module的开发:

Orchard的module非常简单,甚至提供了模板生成工具。我一步一步介绍下如果创建一个Product的增删改查module。

1.Product工程模板的创建。

先确认你已经安装好了Code  Generation模块。

image

接下来使用codegen命令行去创建一个product的project:

image

你可以在bin目录下找到Orchard.exe,通过它来使用命令行来创建project。

修改你的module.txt:

image

 

我的product类如下:

image

 

在Model文件夹下创建类如下:

image

 

编译project后,我们来添加data的migration:

image

 

自动创建好了的migration.cs文件:

image

 

Orchard的migration也是非常酷的,如果你需要修改数据结构,只需要在这个类下面添加方法Update1()最后return 2;然后你再次运行管理页面时,就是有提示信息高速你这个模块需要更新了。

这里不会对migration机制做过多介绍,还是先回归Cache。

 

按照官网介绍,这里我们需要创建一个Handler类,它类似于asp.net mvc中的filter。很简单的一个类:

image

 

接下来你需要注意的地方了,我们要创建一个Service类,来使用Orchard的缓存机制:

image

上图用红色框住的部分就是使用了Orchard的缓存机制,Nicholas.Product是这个缓存key,而后面的Lamda表达式中有个Monitor,它会监视是否发生了Nicholas.Product.Changed这个事件,如果发生了那么久执行剩下的代码,也就说查询数据库,如果Changed事件没有发生,就会从缓存中取Product的信息。

 

你可能有疑问,那Changed发生它如何知道呢,你可以去阅读我上面给出的那个链接。作者对真个代码的运行机制有很详细的介绍。在Orchard中直接给View部分提供数据的是Driver部分。

所以我们还需要driver部分来调用Service类。

image

这里用红色框住的部分,你可以看到我出发了changed事件,这时候,再去调用Service的数据时,那边就会检测到Cache已经过期了,需要使用productRepository从数据库取数据了。

为什么会在这里触发呢,是因为这个是编辑页面的数据驱动,所以当你编辑某个product时,点击保存按钮,那么意味着数据库的数据更新了,所以我们要清除缓存。

 

剩下的就是View部分了,:

image

编译后,去module管理页面使这个module生效就OK了。

具体的使用,你需要看看Orchard CMS的Content part如何使用。建议去官网看看。我就不罗嗦了。

 

2.分析上面的例子

a.缓存实现的方式

传统的或者是大家一般使用的缓存方式是不是都如下面这个样子:

 

 

 
var product = (product)cahce[“product”];

if(product==null)

product=…;

cache.Add(“product”,product,…);

在Orchard中你不需要去判断是否product存在否,只需要去使用Lamda表达式来设置下缓存的改编的事件,也就是那个When();;;;
 

 

 

 

 

 

b.缓存过期机制分析

上面的例子中,我使用的是When(“something_changed”)来实现缓存的过期设置。其实Orchard CMS的缓存机制也可以通过时间来控制的。

在Orchard的Service中有一个IClock Service。

image

你可以通过它来控制Orchard的缓存过期。。因为能够触发Orchard 缓存过期事件的都是需要继承IVlolatileToken这个接口,也就是过期的令牌。

使用时间来控制缓存过期的例子:

image

 

 

你也可以让timespan设置为分或者小时为单位。。。。

 

3.代码的实现:

如果你看了Orchard的Cache实现代码你会发现代码真的很美,整个模式以及编码都很值得借鉴。毕竟是微软的牛人开发的。

 

4.多级缓存的过期机制控制:

对于有时候涉及到一些关联表的操作,在Orchard CMS中对于这种情况,你可以把缓存放在同一个线程。当某一个子表的缓存失效时,Cache机制会自动失效其它关联表的Cache。

image

 

Ps:最近有园子里的朋友发消息说我好久没更新博客了,所以趁着5.1多写几篇,平时的时间很多都是扯淡去了。工作嘛。。

 

posted on 2011-05-01 15:38  Nic Pei  阅读(13927)  评论(8编辑  收藏  举报