- 浏览: 491905 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
设计缓存的目的
缓存模块可以用来实现下列功能:
- 提供了一系列的API
- 它使得开发者不需要学习很多内部的工作机制,就可以将常用的缓存功能加入应用
- 使用企业库的配置工具很容易配置
- 性能高效
- 线程安全,内部的代码考虑到了在多个线程调用,没有非预期的内部交互。
- 使用后端存储,使得发生以外也可以保持数据的完整无缺。
- 保证了内存中的数据和后端存储保持数据同步。
本节讲述一些缓存模块设计的亮点,和设计的细节。还包括一些过期处理的设计和扫描处理的设计。
1、设计亮点
上图显示的是缓存模块中关键类之间的关系。
当你用CacheFactory初始化一个CacheManager对象的时候,在内部创建了一个CacheManagerFactory对象,创建了一个Cache对象。常见Cache对象之后,在后端存储的所有数据被加载到内存中,放在Cache对象中。然后应用可以用CacheManager发出请求,获取数据添加数据,删除数据。
当应用向CacheManager发送请求,使用GetData方法从缓存中获取数据的时候,CacheManager对象会请求Cache对象。如果请求项存在的话,返回缓存的数据,如果不存在返回null,如果对象过期,也返回null。
当应用使用CacheManager的add方法,向缓存中添加项的时候,CacheManager同样将请求发送给Cache对象。如果已经存在一个同样key的项的话,Cache首先会删除原来的项,然后加入新项。如果缓存的后端存储是默认的NullBackingStore,数据只是写入内存。如果添加项的时候,达到了缓存存储数据量的上限的话,BackgroundSchedule对象就会开始扫描,进行过期处理。
如果添加的项在内存缓存中没有的话,Cache首先创建一个复制品,然后添加到内存的hashtable中,然后锁定内存中的项,添加项到后端存储,然后替代内存hashtable中的项。如果在写入后端存储的时候发生异常,就会从内存缓存中删除那个复制品。缓存模块拥有很强的异常安全保护,意味着如果加入项的时候发生异常,缓存的状态可以回滚的添加之前的状态。换句话说,除非添加项成功,否则缓存的状态不会改变。(同样也适用于删除项和清空项)
BackgroundSchedule对象周期性的监测缓存中的项。当一个项过期,BackgroundSchedule首先会移除项,然后有可能会通知应用,项被移除。这时候,应用的责任就是更新缓存。
2、设计细节
CacheManager是一个接口类型,所有的缓存操作都通过接口调用。如果开发者没有修改直接使用缓存模块的话,CacheManager对象提供了访问缓存需要的全部方法,获取、添加、删除、清空项。每个方法都是线程安全的。
使用CacheFactory类创建一个CacheManager对象,还会创建一个CacheManagerFactory类。CacheManagerFactory类会创建实现一个CacheManager所需要的内部类。
不同的缓存不能共享相同的后端储存,每个CacheManager都只能对应一个后端存储。Cache对象接收从CacheManager对象发送过来的请求,实现了所有的在内存缓存和后端储存之间的操作。包含了一个hashtable来存储内存中对应的数据,一个数据项作为一个CacheItem对象。这个对象包括数据本身,还包括了项的key,优先级,RefreshAction对象,和过期策略。这些信息都存放在一个hashtable中,Cache也是线程安全的。Cache用一个同步的hashtable控制应用和BackgroundSchedule对缓存中的项的访问。
BackgroundSchedule对象的责任就是进行过期处理,扫描低级别的项。PollTimer对象激活过期循环,一个数字是一次扫描处理移除的项目。这些都在配置文件中可以设置。
缓存模块中的缓存存储类包括DataBackingStore、IsolateStorageBackingStore、和NullBackingStore。如果你想要实现自定义的后端存储,你需要实现IBackingStore接口,或者是继承BaseBackingStore类,这个类也实现了IBackingStore接口。这个基类包含了实现任何后端存储所需要的策略和工具方法。
当后段存储是使用数据库的时候,可以用DataBackingStore类。在配置工具中,对应于一个数据库实例的名称。
DataBackingStroe和IsolatedBackingStore类可以在持久化之前加密缓存项。加密缓存项可以通过配置来激活。使用配置工具,缓存存储可以使用配置好的加密算法provider。provider的name在从缓存中读取数据,然后在显示之前解密的时候同样需要。
过期策略的设计
缓存模块的过期处理是靠BackgroundSchedule来执行的。它会周期性的检查hashtable中的缓存项,看是否有过期项。你可以在配置缓存模块的时候设置检查周期的时间。
缓存模块提供了四个过期策略:
- Absolute,意味着缓存项在一个特定的时间过期
- Sliding,意味着缓存项在最后一次访问之后的固定时间过期,默认为2分钟。
- Expended format,你可以详细描述过期条件,例如,可以设定为每个星期六晚上10:00,或者是每个月的第三个星期日。Expended formats在ExpendedFormat.cs文件中列出来很多。
- File dependency,意味着当一个文件被修改,缓存项就过期
前三个过期选项都是以时间为基础的,如果数据的更新时间是规则的,或者是在一个特定的时间更新,你可以使用前三个选项。
第四个,文件依赖,是以通知为基础的。它指定缓存项的过期依赖一个特定的文件,如果文件被修改,缓存项就过期,就会删除缓存项。
Add方法有两个重载,一个设置了默认的过期策略,NeverExpired。另外一个你可以设置适合自己的过期策略。你甚至可以设置自定义的策略,如果你为一个缓存项设置了多个策略, 如果由一个策略符合条件,缓存项就会过期。
标记和清除
过期包括两个步骤。一个就是标记,另外一个就是清除。分为两个步骤,就是为了避免BackgroundSchedule清除一个应用正在使用的缓存项可能发生的冲突。
在标记过程中,BackgroundSchedule会拷贝一份hashtable,然后检查里面的每一个缓存项,看看有没有过期的。这时候会锁定缓存项,如果发现过期的,就会打个标记。
在清除过程中,BackgroundSchedule会重新检查缓存项的标记,看看在打上标记之后是否有访问记录。如果有访问记录,就保留缓存项。如果没有,就过期它,删除它。缓存项过期的时候,会引发WMI事件。
回调callbacks
开发者可以选择add方法的另外一个重载,使得在缓存项过期,删除缓存项的时候发通知给应用,如果有必要,应用可以更新缓存。
扫描处理的设计
缓存模块的扫描处理也是由BackgroundSchedule执行的。在每次有缓存项加入的时候都会检查,缓存项的数目是否达到设置的最大值。数量是设置在CacheManager实例上的。
当加入一个缓存项的时候,可以设置优先级,有四个选项:Low,Normal,High,NotRemovable。删除的时候会按照优先级的高低进行处理,优先级低的会先被清除。默认值是Normal。
当你想让一个缓存项直到它过期才被清除的话,可以设置为NotRemovable。最好不要设置为NotRemovable,因为缓存是用来提升性能的,不应该被作为一种持久化手段。
不想过期处理包括两个过程,扫描处理只有一个过程。
未完待续。。。。。。。。。。。。。。。。。。。。。。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 544如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 657组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 518本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5825 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 608前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 828企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 617首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 583概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 990概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 795我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8281 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9661、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 770引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 643oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 599经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 624今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 673我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 803题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 689今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 665题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
### Redis 学习笔记知识点概览 #### 一、Redis 概述与应用场景 ##### 1.1 NoSQL 数据库简介 - **定义**: NoSQL(Not Only SQL)泛指非关系型数据库,它们通常不使用传统的表格关系来存储数据。 - **特性**: NoSQL ...
### 计算机网络-甘晴void学习笔记 #### 一、甘晴void概念解析 在探讨计算机网络之前,我们先来理解一下“甘晴void”这一独特概念。甘晴void是一个融合了清新与深邃的编程理念,旨在引导程序员在编程过程中保持一种...
在本篇“2023年Java相关课程系列笔记之十四Hibernate学习笔记”中,我们将深入探讨Java开发中常用的持久化框架——Hibernate。这个框架由梁建全老师主讲,旨在帮助开发者更高效、便捷地进行数据库操作,弥补JDBC在...
### iBatis 学习笔记知识点总结 #### 一、iBatis 概念与特点 **1.1 iBatis 定义** - **iBatis** 是一个基于 Java 的开源持久层框架,它专注于 SQL 映射,提供了一种将对象与数据库交互过程中的 SQL 语句进行分离的...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
### Nginx 学习笔记知识点总结 #### 一、Nginx 简介及安装 **Nginx** 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,...
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,主要用于简化Java应用程序对数据库的访问。它提供了一种在Java对象和数据库记录之间进行映射的机制,使得开发者...
### 大数据学习笔记知识点概览 #### 第一部分:Spark学习 ##### 第1章:Spark介绍 - **1.1 Spark简介与发展** - **背景**:随着大数据处理需求的增长,传统的Hadoop MapReduce框架虽然提供了强大的计算能力,但...
### MySQL学习笔记知识点详解 #### 一、MySQL安装与配置 **1.1 安装失败解决方案** 在MySQL安装过程中可能会遇到启动失败的情况,解决这一问题通常需要检查以下几个方面: - **确认系统环境变量是否正确配置**:...
### SpringMVC学习笔记 #### 一、SpringMVC配置详解 **1.1 配置SpringMVC分派器及映射** SpringMVC框架的核心组件之一是`DispatcherServlet`,它作为前端控制器,负责接收请求并将请求分发到合适的处理器上。为了...
最后,作为一款开源项目,FBReader7.5源代码还体现了良好的代码组织结构和模块化设计。遵循MVC(Model-View-Controller)或MVVM(Model-View-ViewModel)架构模式,可以指导开发者构建更易于维护和扩展的应用。 总...
{4.1}\ttfamily java.util.ArrayList}{80}{section.4.1} {4.2}\ttfamily java.util.LinkedList}{81}{section.4.2} {4.3}贪吃蛇案例}{82}{section.4.3} {4.4}散列表与HashMap}{83}{section.4.4} {4.4.1}java....
### Oracle学习笔记知识点详解 #### 一、数据库结构 **1.1 物理结构概述** Oracle数据库的物理结构主要包括三类文件:数据文件、重做日志文件和控制文件。这些文件共同构成了数据库的物理存储结构。 **1.2 表...
### Redis学习笔记知识点详解 #### 一、Redis环境搭建 **1.1 Redis简介** Redis是一种高性能的键值存储系统,常被用作数据库、缓存以及消息中间件。其最大的特点是支持多种数据结构,如字符串(String)、列表...