请注意,本站并不支持低于IE8的浏览器,为了获得最佳效果,请下载最新的浏览器,推荐下载 Chrome浏览器
欢迎光临。交流群:166852192

Orchard性能缓存


       众所周知Orchard是一个数据库驱动的Asp.net Mvc Web应用程序,从您的网页、部件、内容项等内容通常存储在数据库中(SqlServer、SqlServerCompact),而从数据库中提取数据是非常慢的(同内存和文件存储项目),如果每次的请求周期都从新读取数据库,那可能极大的影响您Orchard网站的性能,此外很多Orchard部件的第三方接口如:微博、校内这些社交API,在互联网上检索其web服务器也是极其缓慢的,这样也会使Orchard的网站的性能极大的降低。
      上面是引题,引出今天的主角Orchard缓存,整个解决方案的层面上讲,Orchard的整个设计是非常的复杂,这就导致了小的数据量的读写也会是显得有点慢,这就需要一个好的缓存机制了。如果您正在开发Orchard模块,那您一定要使用缓存来提高您模块的性能。
      这里有我简单介绍一下Orchard缓存的优点和机制:
  • 多级缓存:
    Orchard缓存的多级缓存控制机制是非常值得称道的,他可以将有依赖关系的对象自动关联起来进行自动控制,比如:A对象是从B对象得到的,这时候如果B对象过期,那么A对象也会自动过期;这里可以看到所有的缓存是存放在一个ConcurrentDictionary结构里的,这个ConcurrentDictionary可以保证线程安全。
  • 使用简单:
    Orchard抛弃传统的传统get set的缓存方式,Orchard缓存的管理都只提供了一个Get方面没有其他Add、Update等等的东西.从缓存类里Get的方法的实现我们知道, 当程序无法根据TKey获取到结果的时候,就会创建一个新的结果同时保存到缓存里。
  • 过期机制:
    Orchard的缓存拥有强大的过期机制,实际上他的根本是一个失效令牌的机制,令牌只有一个属性: bool IsCurrent 如果IsCurrent==false时Cache过期,而客户代码可以通过实现不同的IVolatileProvider来实现各种不同的过期机制。
  • 优雅的代码风格:
    在Orchard.Framework的Caching目录下有18个文件,有兴趣的同学可以读读源码,写的非常不错。
下面我们用一段简单的代码来演示一下怎么使用其缓存:
public class SlideShowPartDriver : ContentPartDriver {    private readonly ICacheManager _cacheManager;    public SlideShowPartDriver(ICacheManager cacheManager) {        _cacheManager = cacheManager;    }    protected override DriverResult Display(SlideShowPart part, ...) {        // ...        var data = _cacheManager.Get(CACHE_KEY, ctx => {            ctx.Monitor(_clock.When(TimeSpan.FromMinutes(cacheDuration)));            return _service.GetPhotos(...);        });        // ...    }    // ...}

上面展示的是基于时间的缓存过期机制,您也可以监测数据和其他环境变量的变化,来改变其机制。
看到上述的的代码中如果您想基于数据改变时的更新缓存的话,您将_clock换成_Signals如下
public class SlideShowPartDriver : ContentPartDriver {    private readonly ICacheManager _cacheManager;    public SlideShowPartDriver(ICacheManager cacheManager) {        _cacheManager = cacheManager;    }    protected override DriverResult Display(SlideShowPart part, ...) {        // ...        var data = _cacheManager.Get(CACHE_KEY, ctx => {            ctx.Monitor(_Signals.When(SlideShowPart.Changed)));            return _service.GetPhotos(...);        });        // ...    }    // ...}

如果需要其过期就在过期的时候加入_Signals.Trigger(SlideShowPart.Changed);
当然上面的代码只是讲述如何使用,并不能直接执行,如果需要请根据您自己的情况加以修改。


作者原创内容不容易,如果觉得内容不错,请点击右侧“打赏”,赏俩给作者花花,也算是对作者付出的肯定,也可以鼓励作者原创更多更好内容。
更多详情欢迎到QQ群 166852192 交流。