热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OEA中的缓存模块设计

项目组目前开发的基于OEA框架的GIX4项目,本次功能已经完成得差不多了,本次迭代的目标主要是提升产品的性能。由于GIX4是CS结构的应用程序,所以决定实现缓存模块来提升高繁数据访问的缓存。

    项目组目前开发的基于OEA框架的GIX4项目,本次功能已经完成得差不多了,本次迭代的目标主要是提升产品的性能。由于GIX4是C/S结构的应用程序,所以决定实现缓存模块来提升高繁数据访问的缓存。

    本篇文章主要介绍了OEA框架中的缓存模块设计与一般的缓存有什么不同,如何在OEA框架中实现缓存模块。分为以下几个小节:

  1. 一般缓存介绍
  2. OEA缓存目标
  3. 概要设计
  4. 通用缓存框架的详细设计
  5. OEA中集成Cache的详细设计
  6. 小结


一般缓存介绍

    网上介绍缓存的文章比较多,在这里我就挑点重点说一下。

    缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存管理的设计,再到应用软件中的高繁数据的缓存设计;在代码设计方面,小到一个冗余变量的设计,大到分布式缓存的设计;都可以见到缓存设计的身影。

    缓存设计的目的是临时存储需要大量时间进行计算的结果,是一种空间换时间的思想。

    缓存设计中的最重要的变化点是:更新策略(过期策略)。常见的更新策略有:实时检测、心跳检测、缓存依赖检测、绝对时间过期、滑动时间过期等。当然,在应用程序设计中,一个通用的缓存框架,缓存的具体位置也是一个常用的变化点,如:内存、文件、数据库、网络、云。在具体设计中,需要注意这两个变化点。


OEA缓存目标

    以下列举了OEA缓存模块中目前需要支持的一些目标:

  1. 支持DDD领域模型设计。
    OEA框架是基于领域驱动的特定领域的产品线架构框架。它是面向领域模型的,而领域模型是DDD中所描述的富领域模型、聚合对象,缓存框架需要支持这样的实体设计方式。目前,有两类实体最需要使用缓存:高繁使用的聚合根对象、一般的“外键”引用对象。
  2. 对类库开发者透明。
    OEA框架的所有设计围绕实体类进行,开发者最多接触的就是实体类的开发。在实体类及其存储机制的开发过程中,完全不需要考虑缓存机制,而是应该在实体类开发完毕后,在应用程序初始化代码处,使用简单的API定义哪些类需要缓存、如何缓存,OEA框架完成所有的缓存的管理。
  3. 尽量高的命中率。
    这一点是缓存设计的一般性目标。
  4. 及时的数据正确性。
    OEA对数据正确性的要求比较高,也就是说,从缓存中获取的数据,必须和数据库中的数据完全保持一致。
  5. 精确的数据失效范围控制。
    精确的失效范围控制,可以令更少的数据失效,所以获取的数据更少,网络传输的数据也就更少。
  6. 长期硬盘缓存。
    由于支持精确的数据失效范围控制,所以可以把大量数据缓存在客户端硬盘上,常期不失效。这样,客户端在关闭并再次打开后,上次的缓存还能继续使用。
  7. “尽量”获取。
    缓存的数据不能影响应用程序的原有正确性,不管硬盘上的数据怎么样,缓存模块只是“尽量”地工作,不会影响调用者逻辑。
  8. 服务端/客户端都可以使用。
  9. 可在运行时关闭。


概要设计

    整个缓存模块分为两大部分实现:通用缓存框架OEA集成缓存框架

通用缓存框架目标:

image

图1 通用缓存框架目标

    通用缓存框架没有太多特点,预留两个变化点即可:存储位置、更新策略。此处可引入一些成熟缓存框架快速实现。

OEA集成缓存目标

image

图2 OEA中需要的Cache目标

    OEA集成缓存框架是本次开发的重点,需要兼容原来的实体加载模式,并对实体类开发者透明,更重要的是,满足图中的这些场景。(不熟悉OEA的读者,看了上图可能会比较晕。:)   )


通用缓存框架详细设计

    由以上目标可知,Cache暂时支持两个扩展点:存储位置和更新策略。如下图:

image

图3 缓存框架的结构图

图中,用抽象的CacheProvider类来进行存储方式的扩展,用缓存配置类Policy中的ChangeChecker来实现显式的更新检测,并预留此为更新策略扩展点。由于ChangeChecker可能需要保存到数据库中,所以使用了Memoto模式来实现状态的存储。

    我们先来看看目前的CacheProvider:

image

图4 通用缓存框架中内置的CacheProvider

内部实现了四个CacheProvider:

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

OEA集成Cache详细设计

    不熟悉OEA的读者,可以直接跳过本节。

    在OEA进行Cache集成时,比较复杂的是版本号更新策略的实现。具体内容如下图:

image

图5 基于数据范围的版本号的更新策略

给数据进行了范围的划分后,我们只需要对需要的范围内的数据进行进项检测就行了。数据范围越大,则数据过期的可能越大,但是检测的次数较少;范围越小,则可能因为检测的次数过多而造成网络访问次数过多,同样不利,所以对于这里面的使用,需要根据使用场景进行权衡。具体的类设计,接下来会给出。

    整个集成的结构,如下图如示:

image

整个结构中,以EntityCache为中心,分为以下几个部分:

  1. VersionChecker,实现范围版本号更新策略,类图如下:
    image image
  2. CacheDefinition包含了CacheScope来进行数据范围的定义。客户程序使用ICacheDeifinitionInitializer进行缓存范围定义。这样,框架内部就能使用定义的数据范围来进行缓存过期控制。
  3. EntityCache作为集成点,调用通用框架中的Cache、VersionChecker和CacheDefinition进行缓存方案的组装。
  4. EntityRepository中的数据获取方法直接使用EntityCache来尝试先从缓存中获取数据。


结尾

    这样设计的缓存,目前在系统中已经使用了一段时间了,中间出现过几个小问题,不过总体情况还是比较满意的,性能提升较大。

    另外,现在看来,在范围数据的过期设计这一块,较为复杂,不易理解,应该在以后的设计中进行优化。


推荐阅读
  • 开发笔记:Memcached高性能内存对象缓存系统
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Memcached高性能内存对象缓存系统相关的知识,希望对你有一定的参考价值。一、Memcached概述 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 电信网为不能访问联通服务器的网站_老板说网站慢,我们总结了三大阶段提升性能...
    作者:李平来源:https:www.cnblogs.comleefreemanp3998757.html前言在前一篇随笔《大型网站系统架构的演化》中&# ... [详细]
author-avatar
hro5028136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有