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

代码如下:

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表达式就可以。下面这幅图说明了它们之间的关系:

这里还需要再说明三点:
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下一页阅读全文

(0)

相关推荐

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

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

  • asp.net Core中同名服务注册的实现代码

    目录 1.使用.net Core自带容器 2.AutoFac中的实现 通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况下,则需要根据实际情况来选择不同的实现类. 如以下代码中的MyEmailService和EmailService都实现了IEmailService接口: public class MyEmailService : IEmailService { public string Send(string Email)

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

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

  • 在ASP.NET 2.0中操作数据之五十七:在分层架构中缓存数据

    导言: 正如前面章节所言,缓存ObjectDataSource的数据只需要简单的设置一些属性.然而,它是在表现层对数据缓存,这就与ASP.NET page页面缓存策略(caching policies)紧密的耦合(tightly couples)起来.我们对体系机构分层的原因之一便是打破这种耦合.拿业务逻辑层为例,将业务逻辑从ASP.NET页面脱离出来:而数据访问层将数据访问的细节ASP.NET页面脱离出来.从某种意义来说,将业务逻辑和数据访问细节脱离出来是首先,这样的话使系统更易读.易维护.易

  • 在asp.net core中使用类似Application的服务的实现

    Intro# 在 asp.net 中,我们可以借助 Application 来保存一些服务器端全局变量,比如说服务器端同时在线的人数计数,比如一些网站的配置信息. 在 ASP.NET 应用中,之前开发的活动室预约系统把网站的 keyword 以及 Title 等信息,在网站启动的时候会从数据库加载配置并保存到 Application 中,在需要的地方直接使用 Application 来获取,后台更新配置之后,更新 Application 变量,这样就不需要重启网站就可以更新网站配置信息了,在 R

  • ASP.NET Core中的Http缓存使用

    Http响应缓存可减少客户端或代理对web服务器发出的请求数.响应缓存还减少了web服务器生成响应所需的工作量.响应缓存由Http请求中的header控制. 而ASP.NET Core对其都有相应的实现,并不需要了解里面的工作细节,即可对其进行良好的控制. 了解Http缓存 Http协议中定义了许多缓存,但总体可以分为强缓存和协商缓存两类. 强缓存 强缓存是指缓存命中时,客户端不会向服务器发请求,浏览器F12能看到响应状态码为200,size为from cache,它的实现有以下几种方式: Ex

  • ASP.NET Core中使用Redis实现缓存

    目录 一.前言 二.安装StackExchange.Redis 三.添加配置 四.Redis帮助类 五.添加服务依赖项 六.在控制器中使用 七.测试 一.前言 我们这里以StackExchange.Redis为例,讲解如何在ASP.NET Core中如何使用Redis实现缓存.首先需要安装Redis和RedisDesktopManager.RedisDesktopManager用来查看Redis缓存里面的数据.如何安装Redis这里不在讲述. 二.安装StackExchange.Redis 在N

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

    输出缓存的前世今生 ASP.NET 1.0引入输出缓存的概念,这使得开发者可以缓存页面.控件.控制器以及HTTP响应的输出到内存中.在后续的Web请求,ASP.NET就可以使用缓存中的内容更快响应. ASP.NET的输出缓存系统足够灵活,使得我们可以根据不同的查询字符串或者表单post参数来缓存不同版本的内容.例如test.aspx?category=Vegerable 和 test.aspx?category.aspx?category=Meat.它也允许我们根据浏览器类型或者用户语言偏好来缓

  • ASP.NET MVC中使用jQuery时的浏览器缓存问题详解

    介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

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

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

随机推荐