OEA中的缓存模块设计
一般缓存介绍
网上介绍缓存的文章比较多,在这里我就挑点重点说一下。
缓存是信息系统软件硬件设计中常用的设计方法:从底层硬件的CPU结构中的多级缓存,到软件中操作系统中内存管理的设计,再到应用软件中的高繁数据的缓存设计;在代码设计方面,小到一个冗余变量的设计,大到分布式缓存的设计;都可以见到缓存设计的身影。
缓存设计的目的是临时存储需要大量时间进行计算的结果,是一种空间换时间的思想。
缓存设计中的最重要的变化点是:更新策略(过期策略)。常见的更新策略有:实时检测、心跳检测、缓存依赖检测、绝对时间过期、滑动时间过期等。当然,在应用程序设计中,一个通用的缓存框架,缓存的具体位置也是一个常用的变化点,如:内存、文件、数据库、网络、云。在具体设计中,需要注意这两个变化点。
OEA缓存目标
以下列举了OEA缓存模块中目前需要支持的一些目标:
- 支持DDD领域模型设计。
OEA框架是基于领域驱动的特定领域的产品线架构框架。它是面向领域模型的,而领域模型是DDD中所描述的富领域模型、聚合对象,缓存框架需要支持这样的实体设计方式。目前,有两类实体最需要使用缓存:高繁使用的聚合根对象、一般的“外键”引用对象。 - 对类库开发者透明。
OEA框架的所有设计围绕实体类进行,开发者最多接触的就是实体类的开发。在实体类及其存储机制的开发过程中,完全不需要考虑缓存机制,而是应该在实体类开发完毕后,在应用程序初始化代码处,使用简单的API定义哪些类需要缓存、如何缓存,OEA框架完成所有的缓存的管理。 - 尽量高的命中率。
这一点是缓存设计的一般性目标。 - 及时的数据正确性。
OEA对数据正确性的要求比较高,也就是说,从缓存中获取的数据,必须和数据库中的数据完全保持一致。 - 精确的数据失效范围控制。
精确的失效范围控制,可以令更少的数据失效,所以获取的数据更少,网络传输的数据也就更少。 - 长期硬盘缓存。
由于支持精确的数据失效范围控制,所以可以把大量数据缓存在客户端硬盘上,常期不失效。这样,客户端在关闭并再次打开后,上次的缓存还能继续使用。 - “尽量”获取。
缓存的数据不能影响应用程序的原有正确性,不管硬盘上的数据怎么样,缓存模块只是“尽量”地工作,不会影响调用者逻辑。 - 服务端/客户端都可以使用。
- 可在运行时关闭。
概要设计
整个缓存模块分为两大部分实现:通用缓存框架、OEA集成缓存框架。
通用缓存框架目标:
图1 通用缓存框架目标
通用缓存框架没有太多特点,预留两个变化点即可:存储位置、更新策略。此处可引入一些成熟缓存框架快速实现。
OEA集成缓存目标
图2 OEA中需要的Cache目标
OEA集成缓存框架是本次开发的重点,需要兼容原来的实体加载模式,并对实体类开发者透明,更重要的是,满足图中的这些场景。(不熟悉OEA的读者,看了上图可能会比较晕。:) )
通用缓存框架详细设计
由以上目标可知,Cache暂时支持两个扩展点:存储位置和更新策略。如下图:
图3 缓存框架的结构图
图中,用抽象的CacheProvider类来进行存储方式的扩展,用缓存配置类Policy中的ChangeChecker来实现显式的更新检测,并预留此为更新策略扩展点。由于ChangeChecker可能需要保存到数据库中,所以使用了Memoto模式来实现状态的存储。
我们先来看看目前的CacheProvider:
图4 通用缓存框架中内置的CacheProvider
内部实现了四个CacheProvider:
- SQLCompactProvider:由于在客户端需要一定的本地缓存,所以这个缓存提供器主要是实现SQLCompact来进行存储。
- MemcachedProvider:可能会需要使用分布式缓存进行存储。
- MemoryCacheProvider:这是集成了.NET4.0中System.Runtime.Caching.ObjectCache类的实现。由于MemoryCache不支持Region,所以这里添加了RegionCache类来对MemoryCache进行了一层代理,令其支持分区的缓存。
- TwoLevelProvider:这是一个使用装饰模式实现的二级缓存。例如,我们可以在客户端使用Memory+SqlCompact来进行二级缓存。
OEA集成Cache详细设计
不熟悉OEA的读者,可以直接跳过本节。
在OEA进行Cache集成时,比较复杂的是版本号更新策略的实现。具体内容如下图:
图5 基于数据范围的版本号的更新策略
给数据进行了范围的划分后,我们只需要对需要的范围内的数据进行进项检测就行了。数据范围越大,则数据过期的可能越大,但是检测的次数较少;范围越小,则可能因为检测的次数过多而造成网络访问次数过多,同样不利,所以对于这里面的使用,需要根据使用场景进行权衡。具体的类设计,接下来会给出。
整个集成的结构,如下图如示:
整个结构中,以EntityCache为中心,分为以下几个部分:
- VersionChecker,实现范围版本号更新策略,类图如下:
- CacheDefinition包含了CacheScope来进行数据范围的定义。客户程序使用ICacheDeifinitionInitializer进行缓存范围定义。这样,框架内部就能使用定义的数据范围来进行缓存过期控制。
- EntityCache作为集成点,调用通用框架中的Cache、VersionChecker和CacheDefinition进行缓存方案的组装。
- EntityRepository中的数据获取方法直接使用EntityCache来尝试先从缓存中获取数据。
结尾
这样设计的缓存,目前在系统中已经使用了一段时间了,中间出现过几个小问题,不过总体情况还是比较满意的,性能提升较大。
另外,现在看来,在范围数据的过期设计这一块,较为复杂,不易理解,应该在以后的设计中进行优化。
本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2010/11/29/1891105.html,如需转载请自行联系原作者
OEA中的缓存模块设计相关推荐
- Magix中的缓存模块
在前端开发过程中,我们经常会在内存中缓存一些数据,其实javascript的缓存比较简单,只需要声明一个变量或把一些数据挂到某个对象上即可,比如我们要实现一个对所有的ajax请求缓存的方法,简单实现如 ...
- 智能催收系统中自然语言理解模块设计
摘要 随着社会信贷消费的流行,待催收的违约用户逐渐增多.针对此问题,对Rasa对话系统开发框架中的自然语言理解模块进行改进,显著提升智能催收系统中自然语言理解模块的准确率,并对最终得到的训练模型进行性 ...
- java+缓存到服务器,交易系统中服务器端缓存的设计
public classTmpServiceImplextendsBaseServiceimplementsIService{/*** 添加一个Tmp对象到数据库 *@paramargs *@retu ...
- 微软企业库4.1学习笔记(十五)缓存模块3 使用数据库作为后端存储
配置缓存模块使用数据库作为后端存储 1) 在CacheManager节点上点击右键,选择新建[Database Cache Storage] 2)在配置中自动加入数据访问模块的配置信息 3)点击Dat ...
- mysql缓存击穿_Mybatis中的缓存击穿
前言 之前我们探讨了Mybatis中缓存模块的基本实现,对其中CacheKey和缓存的基本实现类PerpetualCache的核心代码进行了探索.传送门:Mybatis中的缓存模块实现 在上篇文章结尾 ...
- 【论文写作】网上选课系统中模块设计如何写
4.2 模块设计 4.2.1 登录模块设计 登录页面为系统的起始页面,登录界面设计如下图所示: 登录模块的功能是判断登录用户的权限以及将用户导航到不同的页面,管理员.教师和学生登录后的页面都是不相同的 ...
- OEA 中的多国语言实现
本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用. 多国语言常见实现及原理分析 管理软件平台,一般来说,都应该支持多国语言,以支持应用程序走向国际化.OEA 最近也提供了多国语言框架,它可 ...
- Mybatis源码之缓存模块分析
缓存这个东西在很多应用中都能看到它们的身影,这次就讲讲在Mybatis中的缓存是怎么应用的,虽然说吧Mybatis中的缓存基本不怎么用,用的更多是第三方组件redis.MongoDB.MemCache ...
- 详谈分布式系统缓存的设计细节
在分布式Web程序设计中,解决高并发以及内部解耦的关键技术离不开缓存和队列,而缓存角色类似计算机硬件中CPU的各级缓存.如今的业务规模稍大的互联网项目,即使在最初beta版的开发上,都会进行预留设计. ...
最新文章
- 2019年中国人工智能产业研究报告
- 【 FPGA 】设置多周期路径约束
- zoj - 1039 Number Game
- 【白话机器学习】算法理论+实战之朴素贝叶斯
- Redis源码剖析(十一)跳表
- eclipse:解决修改文件需要重启tomcat问题
- Google推出“Google实验室” Ad Innovations
- Tomcat 服务器只能存有一个正在运行的项目
- eventfd-aio-test.c
- vagrant up 慢的解决方案
- Java SSM框架之MyBatis3(六)MyBatis之参数传递
- 5.8 拉普拉斯算子和拉普拉斯矩阵,图拉普拉斯算子推导 意境级讲解
- java class 文件
- WinForm自适应的相关代码
- 平面几何基本知识——学习笔记(2)
- 网络端口扫描器.扫描开放端口.TCP/UDP的Socket通信.支持IP地址网段范围的批量扫描.支持多线程操作,提高扫描效率
- 【聊透SpringMVC】28天肝完阿里面试通关宝典
- 单片机流水灯C语言实验报告,单片机LED灯实验报告.doc
- 【maya】学习历程
- 如何在Web前端实现CAD图文字全文搜索功能之技术分享
热门文章
- python中result的用法_Python中qutip用法示例详解
- linux如何禁止pci设备,Linux 内核PCI去除一个设备
- 计算机基础应用000018,计算机应用基础第01章计算机基础知识
- oracle索引可以加到in,为什么你加的索引不管用?
- Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
- [设计模式-结构型]适配器(Adapter)
- java运行 mavenzip包_JAVA开发必知工具-Maven-Maven生成可以直接运行的jar包的多种方式...
- new+date+xxx+java_SpringMVC+MyBatis - 12 spring mvc4返回的json日期为Long的解决方案
- 计算机三级嵌入式系统考试之矩阵键盘
- java 获取服务器IP地址及MAC地址