asp.net SAF 中缓存服务的实现第1/5页

2014-09-27  来源:本站原创  分类:实用技巧  人气:3 

对缓存的兴趣源于张子阳写的一篇文章《SAF 中缓存服务的实现》中的一个例子:

protected void Page_Load(object sender, EventArgs e)
{
    webinfo info = new webinfo();
    Response.Write("有static的执行结果:" + webinfo.a + "<br />");
    Response.Write("没有static的执行结果:" + info.b);
}     

public class webinfo
{
    public static DateTime a = DateTime.Now;
    public DateTime b = DateTime.Now;
}

下面内容多摘自该文章:结果是只要站点不重启(代码也不修改),那么a的值是恒定不变的,即使将页面关了重新打开也一样;而b则是刷新就变化。如果你从事Asp.Net的开发,提起缓存你可能首先会想到Output Cache、数据源缓存或者是基于System.Web.Caching.Cache的对象缓存。实际上缓存的目的就是把对象(数据)存储在内存中,不用每次需要对象服务的时候都重新创建对象(相对耗时)。将对象声明为static,那么对象将在其所属的类被载入AppDomain时初始化,这样对象的生命周期与AppDomain同样长,从而起到缓存的目的。

设计思想
我们经常需要在应用程序中缓存一些常用数据供全局使用以提升性能。如果需要缓存的对象类型和数目是固定的,我们可能会直接将其声明为static;如果我们需要缓存的对象类型和数目是不定的,我们可能会借助一个static Hashtable来实现。但是Hashtable有个缺陷:它没有层次结构,它总是以键/值的形式来存储数据,一个Key对应一个Value,如果我们想获取相关联的一组数据就会比较困难了。

XML文档结构是树形的,具有标准的层次结构。XPath用于从Xml文档中选择一个或多个结点。比如 "/BookStore/Book",选择Book结点下的所有子结点。

SAF 中的缓存服务通过一个在内存中动态构造的Xml文档树作为桥梁,将静态(static)缓存和XPath 这两个技术结合了起来,支持使用XPath的语法来获取Hashtable中对象。其中静态缓存进行实际的数据缓存,XPath用于获取数据对象。从程序员的角度来看,即是Hashtable的Key支持了XPath的语法,可以将原本“平板式”的Hashtable想象成为一个“树形结构”,它的结点包含了缓存的数据,我们通过标准的XPath到达结点(当然这只是一个假象)并获取数据。通过这种方式就可以使用XPath来一次获取Hashtable中的多个相关数据对象。 简单说,SAF缓存服务是为了实现一个有层次(树形)的缓存结构,从而实现对缓存更加灵活的操作。

而实际上是怎么实现这一过程的呢?我们一步步来看:
1、首先在内存中动态构建一个 Xml文档,它只包含一个根结点,可以任意命名,这里将它命名为了Cache。
2、提供一个Xpath路径:获取对象(数据)前首先要存储对象,存对象自然要先提供一个路径(这里称为“路径”,是因为它是一个XPath,实际上也就相当于Hashtable中的键Key)。
3、根据上一步提供的路径,以Cache为根结点,逐层深入地创建XmlNode结点。
4、生成一个GUID,在叶结点上添加一个Key属性,为这个Key属性赋值为GUID。
5、在Hashtable中存储对象,其中Hashtable的Key即为上一步生成的GUID,而Value为要存储的对象。

使用这种方式,Hashtable的实际的Key,即动态生成的GUID对程序员来说是透明的,程序员在存储/获取对象时,只需要提供XPath表达式就可以。下面这幅图说明了它们之间的关系:asp.net SAF 中缓存服务的实现第1/5页

这里还需要再说明三点:
1、我们使用Hashtable存储对象,可以直接将Hashtable声明为static的,也可以将Hashtable声明为instance的,但是将Hashtable所属的对象声明为static的。这里应用了Singleton模式,先将对Hashtable的操作封装成一个类,然后在这个类上应用Singleton模式,确保了这个类只有一个(这个类所维护的Hashtable实例自然也只有一个了)。很明显,这个类包含了主要的逻辑,我们将之命名为Cache。
2、使用Hashtable的好处是可以存储任何类型的对象,缺点是丧失了类型安全。有时候我们可能会想使用一个泛型集合类来取代Hashtable,比如Dictionary<T key, T value>。所以这里又引入了Strategy模式,创建了一个ICacheStrategy接口,这个接口包括三个方法,分别用于添加、获取、删除对象。
3、用Xpath获取结点时,可以是基于当前结点的相对路径;也可以是基于根结点的绝对路径。在本文的范例程序中,使用的是绝对路径,显然这样更加方便一些。

当前1/5页 12345下一页

相关文章
  • asp.net SAF 中缓存服务的实现第1/5页 2014-09-27

    对缓存的兴趣源于张子阳写的一篇文章<SAF 中缓存服务的实现>中的一个例子: protected void Page_Load(object sender, EventArgs e) { webinfo info = new webinfo(); Response.Write("有static的执行结果:" + webinfo.a + "<br />"); Response.Write("没有static的执行结果:" +

  • ASP.NET编程中的十大技巧第1/2页 2013-11-18

    在本篇文件中,我们将讨论编程人员在使用ASP.NET开发应用程序时需要注意的10个技巧,这些技巧涉及从缺省的控件.表单名的改变到StringBuilder类的使用,有助于编程人员能够尽快地适应.NET环境. 1.在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字. .NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑.如果不愿意,我们并非一定要使用Visual Studio .NET作

  • ASP.NET 4中的可扩展输出缓存(可以缓存页面/控件等) 2014-03-07

    ASP.NET 1.0引入输出缓存的概念,这使得开发者可以缓存页面.控件.控制器以及HTTP响应的输出到内存中,接下来详细介绍,感兴趣的朋友可以了解下 输出缓存的前世今生 ASP.NET 1.0引入输出缓存的概念,这使得开发者可以缓存页面.控件.控制器以及HTTP响应的输出到内存中.在后续的Web请求,ASP.NET就可以使用缓存中的内容更快响应. ASP.NET的输出缓存系统足够灵活,使得我们可以根据不同的查询字符串或者表单post参数来缓存不同版本的内容.例如test.aspx?catego

  • Laravel框架中实现使用阿里云ACE缓存服务 2014-07-11

    这篇文章主要介绍了Laravel框架中实现使用阿里云ACE缓存服务,本文扩展了一个ACE缓存驱动,以便使用阿里云ACE缓存服务,需要的朋友可以参考下 之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 OCS 缓存服务.有网友问我,ACE 的缓存怎么在 Laravel 4 中使用.我本来觉得应该可以完全用相同的办法,后来自己尝试的时候才发现,ACE 的缓存差别非常大.所以再写一篇,介绍一下如何在

  • ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云 2015-01-13

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平均优先级的服务. 1. 添加命名为Services 的文件夹,在该文件夹下添加名称为 StatisticsService.cs 的类: StatisticsService 类代码设计如下: System.Linq; System.Threading.Tasks; TodoList.Models; T

  • Asp.net禁用页面缓存的方法总结 2013-11-26

    这篇文章主要介绍了Asp.net禁用页面缓存的方法,需要的朋友可以参考下 1.在Asp页面首部<head>加入 Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" Response.AddHeader "Pragma", "No-Cache" 2.在HtML

  • Laravel 4.2 中队列服务(queue)使用感受 2014-04-28

    Laravel的队列组件为许多队列服务提供了统一的API接口.队列服务让你可以异步处理一个耗时任务,比如延迟发送一封邮件,从而大大加快了应用的Web请求处理速度. 这半个月,我参与重写了一个微信公众号后端系统,首次使用了laravel 4.2,以及laravel引以为傲的队列服务(queue). 由于整个系统涉及到多端交互,又有大量语音传输.处理的业务,我们在一些地方发现响应时间过长.之前的系统基于node.js和mongoDB,由于node天生就是异步,有守护进程,所以并没有出现过这个问题,而

  • asp.net页面SqlCacheDependency缓存实例 2014-07-28

    这篇文章主要介绍了asp.net页面SqlCacheDependency缓存实例,以一个完整实例来展现asp.net中缓存技术的使用方法,需要的朋友可以参考下 缓存技术是asp.net程序设计中非常实用的技术,也是大型web程序设计中比较常见的技术.本文就以实例形式对此加以说明.具体如下: asp.net页面的SqlCacheDependency Sql缓存: Cahce/SqlCachePage.aspx页面代码如下: <%@ Page Language="C#" Master

  • ASP.NET State service状态服务的问题解决方法 2014-10-22

    每次重启机器以后,在.NET2005上跑Web程序老是遇到这样的问题 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端口是相同的.如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection

  • ASP.NET MVC中对Model进行分步验证的解决方法 2012-03-09

    在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的.当时很纠结,因为刚接触Asp.net MVC,故没有找到解决方案.这篇文章将给出解决的办法.看下面需要验

  • 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统 2012-03-09

    在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就是OAuth.新浪微博这个开放系统做的就很好.但OAuth并非本文讨论范畴.这里主要讨论jQuery1.5 jsonp 在Asp.net MVC3 中的应用. 本文应用场景: 假设您的开发团队欲为某集团公司开发一整套信息管理系统,目前首要开发的就是一套订单系统和一套内部OA系统.前提是这两套系统使用

  • ASP.NET 页面中加添加用户控件的写法 2013-11-15

    这篇文章主要介绍了ASP.NET 页面中加添加用户控件的方法,需要的朋友可以参考下 一:在页面前台中添加注册控件 <%@ Register Src="~/Controls/IndexTop.ascx" TagName="IndexTop" TagPrefix="uc_top" %> 二:在页面需要添加控件的地方添加控件内容 复制代码 代码如下: <uc_top:IndexTop ID="IndexTop1"

  • ASP在ACCESS中模糊查询"内存溢出"的解决方法 2013-12-27

    这篇文章主要介绍了ASP在ACCESS中模糊查询"内存溢出"的解决方法,本文导致这个问题的原因是字符编码问题,使用了一个转码函数解决,需要的朋友可以参考下 今天在日常维护一个网站时,发现该网站的留言程序没有经过严格的验证过滤,导致了将近十万条垃圾数据.而其中又不乏重要信息,需要清理数据,以及增加更为严格的验证措施. 而通过在数据库中直接删除又不太科学,会误删很多重要信息. 通过 模糊查询语句: select * from Feedback where Comments like '%h

  • ASP.NET(C#)中操作SQLite数据库实例 2014-01-29

    最近项目中有使用到SQLite数据库,于是查找资料,编写了一个ASP.NET基于C#语言的SQLite数据库操作实例.大家看代码就可以看懂了,和以往使用ADO.NET操作SQL数据库类似. 要想在ASP.NET项目中使用SQLite数据库,先需下载一个ADO.NET 2.0 SQLite Data Provider,下载地址为:http://sourceforge.net/project/showfiles.php?group_id=132486&package_id=145568,下载后安装完

  • C#中缓存的基本用法总结 2014-02-15

    这篇文章主要介绍了C#中缓存的基本用法,对C#初学者来说是很有必要熟练掌握的内容,需要的朋友可以参考下 本文初步探讨了C#缓存的原理及应用,并以实例加以分析总结,这些对C#初学者来说是很有必要熟练掌握的内容.具体如下: 一.概述: 缓存应用目的:缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 1.缓存的引用空间:System.Web.Caching; 缓存

  • asp.net自定义控件中注册Javascript问题解决方案 2014-04-08

    这篇文章主要介绍了asp.net自定义控件中注册Javascript的问题,需要的朋友可以参考下 protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); RenderJS(); } private void RenderJS() { if (!Page.ClientScript.IsClientScriptBlockRegistered(SCRIPT_ID))//如果还没有注册语句,则注册 { Page.Cl

  • ASP.NET MVC中的AJAX应用 2014-04-25

    这篇文章主要介绍了ASP.NET MVC中的AJAX应用的相关资料,需要的朋友可以参考下 一.ASP.NET MVC中的AJAX应用 首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒): ASP.NET MVC提供了2个常用的ajax辅助方法. Ajax.ActionLink 该辅助方法用于在页面上生成具有ajax功能的超链接. 在该辅助方法中有一个AjaxOptions类型的参数,它包括如下属性: Confirm:在发送ajax请求前,弹出确认对话框

  • perl实现检测服务器中的服务是否正常脚本分享 2014-05-02

    这篇文章主要介绍了perl实现检测服务器中的服务是否正常脚本分享,本文脚本用于检测Linux服务器的服务是否正常,需要的朋友可以参考下 程序调用远端服务,为了确保可用性最好在使用前进行健康检测,将异常的服务排除. #!/usr/bin/perl # use strict; use IO::Socket; my @servers; $servers[0]=['180.153.100.93',2222]; $servers[1]=['180.153.100.93',22]; $servers[2]=

  • 动态创建script在IE中缓存js文件时导致编码的解决方法 2014-05-19

    这篇文章主要介绍了动态创建script在IE中缓存js文件时导致编码的解决方法,需要的朋友可以参考下 先看下重现代码 1, gb2312.html 该文件编码为gb2312 <!DOCTYPE html> <html> <head> <title></title> <meta charset="gb2312"/> <style> p { color: red; } </style> <

  • ASP.NET 程序中删除文件夹导致session失效问题的解决办法分享 2014-05-23

    这篇文章主要介绍了ASP.NET 程序中删除文件夹导致session失效问题的解决办法分享,有需要的朋友可以参考一下 在Global中 Application_Start 添加 如: void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChange