3.1 缓存定义
缓存是计算机领域非常重要的一个概念,它是介于应用程序和永久性的存储系统(比如数据库,文件系统等)之间一种媒介。缓存降低了应用程序对持久性数据源的访问,从而使得应用程序具有更好的性能。
3.2 缓存种类
3.2.1 按照缓存中的元素划分
缓存按照缓存中存储的内容来划分可以划分为:
数据缓存(比如数据库中内置的缓存)
文件缓存(比如文件系统的缓存,浏览器的缓存js,css文件等)
对象缓存
对象缓存是这次交流的重点,采用了DDD以后,系统会有一个完整的领域模型,这个领域模型一般目前都是通过对象模型来实现的,那么这个对象模型的就要用到对象缓存了。
4) 其它缓存(比如CPU内部的高速缓存等等)
3.2.2 按照缓存和应用程序的耦合度划分
Local Cache
Local Cache是指应用程序与缓存运行在统一进程中,比如目前J2EE界流行的OScache,Ehcache,jbosscache等。这一类型的缓存离应用程序近,因此效果也比较好,但是无法应对分布式和集群情况下的缓存要求,因为local Cache多数都是采用了广播机制来对各个节点进行更新,这样在集群环境下,当节点个数比较多的时候,广播通信就会对系统带来很大的开销,甚至这种开销抵消了缓存带来的性能方面的提升。
Remote Cache
Remote Cache是指应用程序与缓存运行在不同的进程中,这种类型的缓存的代表是著名的Memcached,Remote Cache是一种分布式和集群级别的缓存,这种情况下,应用程序一般通过缓存系统的协议与缓存系统进行交互。
3.2.3 按照缓存的生命周期划分
按照缓存的生命周期来划分,缓存可以分为以下几种类型:
Request或者事务级别
Request级别的缓存一般存在于单个的Request生命周期里面,当一个Request结束的时候,缓存也就消失了。Request级别的缓存的代表是Hibernate的一级缓存。Request级别的缓存也可以叫作事务级别的,因为每次事务结束的时候,缓存也随之消失。
Session级别
Session级别的缓存一般是扩展到了整个Session期间,它存活于整个Session周期中,当Session结束时,Session级别的缓存也随之结束。这方面的缓存比如Httpsession或者Statefull session bean 扩展持久化上下文。
Application级别
Application级别的缓存存在一个整个Application的生命周期之中,当应用程序启动的时候,缓存生命周期开始,当应用程序结束的时候,缓存的生命周期结束。
在采用了DDD建模以后形成了领域模型,这个领域模型需要缓存,此时主要是指Applicaiton级别的缓存,是整个应用程序级别的缓存。
3.3 缓存的清除策略
当缓存中的元素超过缓存的限制的时候,缓存系统就会采用一定的缓存策略将缓存中的元素从缓存中移除,缓存的清除策略主要有以下3种:
FIFO (First In First Out)
这种缓存策略表示当缓存清除缓存元素的时候,缓存系统会清除在缓存中时间最长的元素。
LRU (Least Recently Use)
这种缓存策略表示当缓存清除缓存元素的时候,缓存系统首先清除最近最少使用的元素,这种情况下,一般缓存元素都会有一个时间戳,缓存系统会选择清除时间戳离当前时间最远的元素。
LFU (Less Frequently Use)
这种缓存策略表示当缓存清除缓存元素的时候,缓存系统首先选择缓存中一直以来最少使用的元素,这种情况下,缓存元素一般都会有个hits属性,每次命中以后,hits都会加一,当要清除的时候,缓存系统选择hits最小的元素清除。
在选择缓存清除策略的时候,我们根据当前业务系统的特点来进行选择,每一种缓存清除策略都有它自己的优点。一般情况下推荐使用LRU。
4 领域模型和缓存如何配合?
4.1 对底层缓存系统进行封装
采用DDD建模和缓存以后,首先我们面临的问题就是如何对缓存系统进行封装的问题,因为缓存系统是一种技术的时候,同时也有好多种选择,我们不能让领域模型依赖于具体的缓存技术,这个时候就需要进行缓存的封装。而在本次CBB LPQ的设计中,我们的团队也对底层缓存系统进行了封装,具体在封装的时候,我们可以通过图4-1所示的方式进行封装:
图4-1 Cache 类图
4.2 提供统一的缓存入口
在系统中引入缓存之后,我们需要提供一个统一的缓存入口,系统的其它部分要想通过缓存来获取领域对象都必须通过统一的缓存入口。通过提供统一的缓存入口使得缓存的管理更加方面。如果不提供一个统一的缓存入口,这样整个缓存的逻辑就散落在了系统的不同部分,这样维护起来就比较麻烦。
4.2 Factory与Cache的结合
采用DDD建模以后,系统中会形成很多领域对象,当需要创建一个领域对象的时候,因为领域对象涉及到很多状态,要构建一个状态非常多的领域对象非常复杂,因此有必要通过工厂来封装,在工厂创建领域对象的时候,因为领域对象聚合了很多的子对象,同时还关联了了其它的聚合根对象,因此当创建一个聚合根的时候,当需要另外的领域对象的时候,首先从缓存中取,如果有就直接返回,没有再查询DB获取,最终形成一个完整的领域对象返回。举个例子,比如创建一个论坛帖子的时候,我们需要获得是谁发帖子,因此在创建帖子的时候,我们需要得到Account(用户)对象,而此时就需要首先从缓存中获取Account对象,如果存在就直接返回,不存在再查数据库。
5 领域模型和缓存总结
经过领域建模以后,系统形成了良好的领域模型,在这个领域模型真正与架构融合,并且跑起来之后,领域模型需要一个生存的场所,领域模型需要在这个生存的场所里面完成它的生命周期,这个生存场所就是缓存。领域模型+缓存是一种面向业务的分析、设计和面向业务的存储结合的结果,这种结合的结果就是能方便的进行面向业务的内存计算。
目前key-value存储系统正处在不断的快速发展过程当中,等以后key-value存储系统真正普及以后,我们可以通过key-value存储系统来作为领域模型的生存场所,这样整个系统也将完全是一种:面向业务分析、设计,面向业务的存储,面向业务内存计算的结合体,这将是非常完美的一个新世界。
5.1 Scalability(伸缩性)
通过将领域模型放入缓存,使得领域模型能够真正的以业务形态存在于内存中,能真正以业务形态进行内存的运算,这样以来,系统负载增多的时候,我们可以采用分布式和集群级别的缓存,这样就增强了系统的水平伸缩性。如果采用传统的那种方式,大部分业务逻辑都与数据耦合,这样当系统负载增多时候,数据库就成为了最不具伸缩性的一层。5.2 Performance(性能)
这也是Hibernate创始人所描述的:数据库成为了大多数企业应用的主要瓶颈,也成为了运行环境中最不具伸缩性的层。
系统性能方面,因为引入了缓存,这样当每次用户请求来的时候,系统将用更少的时间来完成对用户请求的响应,这样也将提高性能“多快”的方面,同时因为通过缓存降低了对数据库的压力,从而使得系统能应对更多的访问量,这也就增加性能“多大”的方面。同时在性能“多大”方面,通过引入分布式和集群缓存,甚至是引入key-value存储系统,我们的系统能平滑的过渡到一种分布式和集群环境中,这样也使得系统能应对更大负载,从而提升了性能“多大”的方面。
四 总结
采用DDD以后,系统形成了完整的领域模型,这个领域模型已经如实的反映了我们领域的实质,这样领域模型的可扩展性,可维护性和可复用性就非常高,而通过将领域模型和缓存结合以后,整个系统变成了一种:面向业务分析、设计,面向业务的存储和面向业务运算结合的一种更加具有良好性能表现和伸缩性的系统。
因此领域模型和缓存使得系统在可扩展性,可维护下,可复用性,可伸缩性以及性能方面都有良好的改进和提高。
结论:
1. 软件不是计算工具,软件帮助人们解决某一领域的复杂问题
2. 软件的核心是领域模型,而不是技术
3. 领域模型是一种面向业务的模型
4. 领域模型更加忠实地反映了软件实质
5. 领域模型+缓存=面向业务的分析和设计+面向业务的存储
6. 领域模型+RDBMS=面向业务的分析和设计+面向关系的存储,不匹配,矛盾!
7. 领域模型使得系统在满足功能的同时,具有可扩展性,可 维护性,可复用性
8. 领域模型和缓存使得系统具有更好的伸缩性和性能
9. 领域模型使得系统天然的具有功能性和非功能性的血统
10.领域模型和架构的关系:分析设计的时候领域模型独立于架构,而实现的时候,领域模型和架构粘合,真正运行的时候,领域模型和架构完全统一(是不是类似于EJB中,编程时分离,部署时粘合,运行时真正统一的思想)
相关推荐
采用领域驱动的开发方式,最终系统形成了一个通用的模型,这个模型是完全面向业务的,这个模型是业务人员和开发人员都能容易理解的,同时这个模型也是如实的反映了领域实质的,这样以来软件不是依赖于某种技术,同一...
- **重要性**:在复杂的应用程序中,领域模型通常需要与数据库、缓存和其他服务进行交互。这些交互通常涉及到诸如事务管理、缓存更新、事件发布等操作。 - **挑战**:随着应用规模的扩大,领域模型管理可能会变得...
在IT行业中,尤其是在3D地理信息系统(GIS)和游戏开发领域,加载地形缓存和动画模型是关键的技术环节。本文将深入探讨如何在场景中实现这一功能,主要针对SuperMap iMobile平台,这是一个广泛用于移动GIS应用的强大...
在分布式系统中,缓存一致性问题是系统性能的关键。由于分布式系统由多个计算节点组成,这些节点...本篇文献详细地探讨了分布式系统中缓存一致性设计的多个方面,为相关领域的研究者和开发者提供了宝贵的参考和指导。
综上所述,《Web应用中的海量数据访问缓存技术》不仅提供了对现有缓存技术的全面概述,更重要的是,它创新性地提出了一种整合线程池、连接池和数据Cache技术的框架模型,有效解决了Web应用在处理海量数据时面临的...
在数据库领域,主要存在三种模型:概念模型、逻辑模型和物理模型,每种模型都有其独特的用途和特点。 1. 概念模型(Conceptual Model): 概念模型,也称为信息模型,是数据库设计的起点,它以用户或业务的角度来...
这种思想源自于计算机体系结构中的层次存储模型,从高速缓存(如CPU缓存)到内存,再到硬盘,速度和容量依次递减。 缓存主要分为硬件缓存和软件缓存两大类。硬件缓存,如CPU的L1、L2、L3缓存,是由硬件自动管理的,...
领域模型应该专注于特定的业务操作领域,与业务的其他部分和应用程序的其他层保持隔离。它的设计应具备模块化、可扩展性,并且能够独立于持久化机制和技术框架。此外,领域模型应该是可重用的,以避免重复的业务逻辑...
在《概念模型、逻辑模型、物理模型区别》文档中,作者HZQ可能会详细探讨这些模型的特点、转换方法以及在实际工作中的应用案例,帮助读者深入理解数据库设计的各个环节。通过阅读这份文档,我们可以获得更丰富的知识...
BIM模型的缓存可以通过批量生成或单独生成数据集模型缓存的方式进行,以适应不同的应用场景需求。 在实际操作中,例如,可以使用工具将BIM模型或OSGB倾斜摄影数据转换为S3M格式的缓存。对于BIM模型,可以批量生成...
如果IT团队在开发大中型企业软件应用时没有遵循DDD方法,可能导致应用架构出现“肥服务层”和“贫血的领域模型”。这种架构下,业务逻辑分散在多个外观类中,导致维护困难、需求变更响应慢,无法为公司带来竞争优势...
在IT领域,尤其是在Java Web开发中,`SpringMVC`、`Spring`、`Hibernate`以及`Ehcache`和`Fastjson`是常见的技术组件,它们分别在不同的层面上发挥着关键作用。以下是这些技术的详细介绍: 1. **SpringMVC**: ...
Unity3D是一款强大的跨平台游戏开发引擎,广泛应用于游戏、虚拟现实、增强现实等领域。在3D动画制作中,点缓存(Point Cache)技术是一种常见的动画数据存储和重用方式,尤其在与3DS MAX等专业3D建模软件协同工作时...
IEC61850不仅在电力系统中广泛应用,也在其他公用事业领域如水电和风力发电等领域得到了推广。该标准的实施有助于提升系统的互操作性和智能化水平。 #### 二、报告模型的定义与原理 ##### 1. 报告模型的基本概念 ...
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法,它强调通过与领域...通过理解和应用领域模型、领域事件、聚合、仓储、领域服务等核心概念,我们可以构建出更贴近业务需求、更易于维护的软件系统。
该模型提供了数据的持久化存储功能,为关键领域应用提供了消息安全性的保证,但同时也带来了性能上的影响,如对硬盘的访问延迟较高,降低了中间件的性能;大规模并发操作会造成对单一磁盘资源的竞争,导致整体性能...