OEA框架学习:缓存

一、摘要

       

       陆陆续续学习OEA,也有一段时间了,从整体上来说自问还是了解,我们先来看看作者是怎么想的OEA中的缓存模块设计,看完了作者的文章为了巩固所学我们在来阅读代码,提高编程思维。

二、 技术背景

设计要点:寻找功能的共同点和变化点。

共同点:

      缓存使得你可以快速的获取内存中存储的数据。当再次访问数据的时候,应用从缓存中获取数据,而不是从数据的原始源获取。这么做可以提高性能和扩展性。另外,当数据源临时不可用的时候,缓存使得数据还是可用的。

变化点。

缓存设计中的最重要的变化点是:更新策略(过期策略)。

常见的更新策略有:实时检测、心跳检测、缓存依赖检测、绝对时间过期、滑动时间过期等。当然,在应用程序设计中,

一个通用的缓存框架,缓存的具体位置也是一个常用的变化点,如:内存、文件、数据库、网络、云。

在具体设计中,需要注意这两个变化点。

要用的知识点:

装饰模式


.NET4.0的可扩展缓存系统 System.Runtime.Caching 架构图

System.Runtime.Caching 类图:

image

代码的核心就是ObjectCache(缓存容器)

MemoryCache类是一个实现ObjectCache类的内存缓存,你可以用它来完成大部分的工作。

MemoryCache类的原型定义在System.Web.Caching空间中的ASP.NET缓存对象,因此,内部的缓存逻辑和早期的ASP.NET提供的缓存逻辑很相似。

抽象基类提供了下面的功能:

  • 创建并管理缓存。
  • 指定过期和收回。
  • 在缓存信息改变的时候触发事件。

ChangeMonitor 为用于监视缓存项所依赖数据的状态更改的派生自定义类型提供基类

SqlChangeMonitor 提供对 SQL Server 数据库的更改监控

HostFileChangeMonitor 监视目录和文件路径,并向缓存通知被监视项的更改情况

FileChangeMonitor表示用于监视对文件的更改的对象。

image

创建自己的缓存提供者:

  • 创建一个继承ObjectCache的类,提供自定义的缓存实现。
  • 创建一个集成MemoryCache的类,提供自定义的缓存实现。
  • 创建一个继承OutputCacheProvider的类,并且配置应用使用这个自定义的输出缓存provider。

三、 OEA缓存

通用缓存模块OEA使用的是.NET.4.0可扩展的缓存System.Runtime.Caching

通用缓存框架代码结构:

image image

缓存提供者结构如下:装饰者模式

S{6S0QKP4M)_0X)7E71P4]W

HybirdCacheProvider 组合MemoryCache (一级缓存:内存) , DiskCache (二级缓存:硬盘 )

内部实现了四个CacheProvider:

  1. SQLCompactProvider:由于在客户端需要一定的本地缓存,所以这个缓存提供器主要是实现SQLCompact来进行存储。
  2. MemcachedProvider:可能会需要使用分布式缓存进行存储。
  3. MemoryCacheProvider:这是集成了.NET4.0中System.Runtime.Caching.ObjectCache类的实现。由于MemoryCache不支持Region,所以这里添加了RegionCache类来对MemoryCache进行了一层代理,令其支持分区的缓存。
  4. TwoLevelProvider:这是一个使用装饰模式实现的二级缓存。例如,我们可以在客户端使用Memory+SqlCompact来进行二级缓存。
  5. 装饰者模式使用场景:

    1. 需要扩展一个类的功能,或给一个类添加附加职责

    2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

    3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

    4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

  • 四、 使用缓存

    测试用例

    1:  [TestMethod]
    2:         public void TestCache()
    3:         {
    4:             Cache MemoryDisk = new Cache(new MemoryCacheProvider());
    5:             MemoryDisk.Add("Test", "KLmg", new Policy());
    6:         }
    7:   

  • 原文地址:https://www.cnblogs.com/luomingui/p/2866293.html