深入System.Web.Caching命名空间 教你Hold住缓存管理(一)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法。看完之后你将学会:

一,System .Web.Caching与缓存工作机制简介

  System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站的开发,包括在B/S项目中的开发。

  缓存的设计主要是考虑到网络带宽可能会延缓数据的提交与回发,如果把数据保存在客户端,用户就可以直接从客户端读取数据,减少客户端与服务器端的数据交互,提高程序的性能。

  缓存命名空间中的类及其说明:

  • Cache 对缓存对象的编辑类,其操作包括缓存的增删改
  • CacheDependency 基本缓存对象的依赖,当基本对象发生变化时,更新缓存内容
  • SqlCacheDependency 数据库缓存对象的依赖,当数据库中的数据发生变化时,更新缓内容

  其中,缓存任何对象都使用类Cache,但当缓存发生改变时,普通对象与数据库对象的依赖处理不同,分别对应以上两个依赖。

  下图展示了三层结构中缓存的工作机制:

  

二,管理缓存的类:Cache

  1.功能说明

  Cache类属于字典类(键-值对),其根据一定的规则存储用户需要的数据,这些数据的类型不受限制,缓存的数据可以是字符串,数组,数据表,自定义类等等。

  使用Cache类的优点是当缓存的数据发生变化时,Cache类会让当前缓存数据失效,并实现缓存数据的重新添加,然后通知应用程序,报告缓存的及时更新。

  2.语法定义

  Cache类的语法定义如下:

public sealed class Cache : IEnumerable

  

  通过定义发现,Cache类是sealed密封的类,不能被集成。同时Cache继承了IEnumerable接口,允许对集合中的数据进行枚举操作。

  缓存的生命周期随着应用程序域的活动结束而终止,也就是说只要应用程序域依然出于活动状态,缓存就一直会保持,因为每个应用程序域都会创建一个缓存实例。此实例的信息可以通过HttpContext对象,Page对象的Cache属性获取。

  3.方法详解

  Cache类的方法主要提供对缓存数据的编辑操作:

  • Add 将数据添加到Cache对象
  • Insert 向Cache中插入数据项,可用于修改已经存在的缓存数据项
  • Remove 移除Cache对象中的缓存数据项
  • Get 从Cache对象中获取指定的数据项,注意返回的是Object类型,需要进行类型转换。
  • GetType 从Cache对象中获取数据项的类型,判断数据类型后方便进行类型转换。
  • GetEnumerator 循环访问Cache对象中的缓存数据项,其返回类型是"IDictionaryEnumerator"

  最需要注意的是Add方法的参数,其使用语法如下:

public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
  • key:表示缓存数据项的键值Key,必须是唯一的。
  • value:要添加到缓存的项。可以是任意的类型。
  • dependencies:表示缓存的依赖项,此项发生变化时就意味着缓存内容已经过期,并从缓存中移除。如果没有依赖项,则此值设置为null。
  • absoluteExpiration:绝对到期,所添加对象将到期并被从缓存中移除的时间。
  • slidingExpiration:可调到期,最后一次访问所添加对象时与该对象到期时之间的时间间隔。如果该值等效于20分钟,则对象在最后一次被访问20分钟之后将到期并从缓存中移除。
  • priority:撤销缓存的优先值,由System.Web.Caching.CacheItemPriority枚举表示。缓存在退出对象时使用该值,优先级低的数据项先被删除。
  • onRemoveCallback:表示缓存删除数据对象时调用的时间,一般用作通知程序。

  特别有一点要提一下,绝对到期和可调到期只能指定一个,

  使用绝对到期,则可调到期值必须为System.Web.Caching.Cache.NoSlidingExpiration,禁用可调到期。

  反之,使用可调到期,则绝对到期的值必须为System.Web.Caching.Cache.NoAbsoluteExpiration,禁用绝对到期。

  Insert方法和Add方法的参数是一样的,不过Insert方法提供了更多的重载,如果你不提供某个值,那这个值就会被设置为默认值。

  下面的例子演示了Cache的基本用法:

 public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Cache["League"] = "NBA";//指定了Key与Value,其他参数均为默认值
            Cache["League"] = "CBA";//更新缓存项内容方法,同上
            ArrayList player = new ArrayList();
            player.Add("JohnConnor");
            player.Add("YaoMing");
            player.Add("KobeBryant");
            //使用Add方法新增一个缓存项,Key为"Player",值为player对象,可调到期10分钟,优先级Normal,无回调委托
            Cache.Add("Player", player, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null);
            player[0] = "MichaelJordan";
            Cache.Insert("Player", player);//Insert方法可以用来插入缓存项或更新其内容,这里使用了最简单的重载
            Response.Write(Cache["Player"].GetType().Name + "</br>");//GetType方法可以来获取缓存项内容的类型
            Response.Write(Cache.Get("League").ToString() + "</br>");//Get方法来根据Key获取Value
            IDictionaryEnumerator mycache = Cache.GetEnumerator();//使用GetEnumerator方法来遍历缓存项
            while (mycache.MoveNext())
                Response.Write(mycache.Key + "</br>");
            Cache.Remove("League");//移除Key为"League"的缓存项
        }
    }

  

  代码中使用了ArrayList,所有别忘记了添加”System.Collections“命名空间的引用,当然使用Cache,别忘记了添加”System.Web.Caching“.

  4.属性详解

  Cache类的属性主要用来获取缓存数据的一些基本信息,这里主要介绍Count和Item属性。

  Count用来获取缓存中所有缓存项的总数:

Response.Write(Cache.Count);//缓存项总数

  Item用于返回制定项的内容,前面其实已经演示过了,一般继承”IEnumerable“接口的类都有这样的属性,使用[]来包装,用法如下:

Response.Write(Cache["League"]);

 

三,典型应用,实现数据缓存的快速读取

  Cache主要用来缓存使用频率高且不需经常更新的数据。我们来做一个球员列表的缓存,为了演示方便,假设不从数据库中读取数据,而是存在一个ArrayList对象中。

  1.首先在打开VisualStudio创建一个ASP.NET网站,命名为”JohnConnor.CacheSample“。

  2.打开默认生成的Default.aspx页,在设计视图中添加一个下拉列表框和一个按钮。

  3.切换到页面的代码视图,不要忘记添加命名空间的引用喔。

using System.Collections;
using System.Web.Caching;

  4.在”Page_Loda“事件中判断是否存在球员列表缓存,如果没有,则将球员列表添加到缓存中。详细代码如下:

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                ArrayList player = new ArrayList();
                player.Add("JohnConnor");
                player.Add("YaoMing");
                player.Add("KobeBryant");
                if (Cache["Player"] == null)//如果没有缓存就添加缓存
                {
                    Cache.Add("Player", player, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10), CacheItemPriority.Normal, null);
                }
            }
        }

  

  5.然后我们在按钮的双击事件中判断是否有球员列表的缓存,有则显示列表内容,没有则清空下拉框:

 protected void Button1_Click(object sender, EventArgs e)
        {
            if (Cache["Player"] != null)//判断缓存是否失效
            {
                //缓存未失效则取出球员列表缓存
                DropDownList1.DataSource = Cache["Player"] as ArrayList;
                DropDownList1.DataBind();
            }
            else
            {
                DropDownList1.Items.Clear();//缓存失效则清空列表
            }
        }

  现在F5运行程序,因为我们设定的是可调到期10秒,可就是说距离最后一次访问10秒后,缓存就会失效。

  我们在一开始10秒内点击按钮,球员列表就会被绑定到下拉框。

  但之后的10秒内无动作,再点击的话,下拉框就会被清空。因为缓存已经失效了。

  这一篇是缓存管理的第一篇,我们介绍了System.Web.Caching命名空间和其下Cache类的使用方法,并没有涉及缓存依赖的内容。

  当实际数据改变的时候,如果缓存不发生改变,那是很糟糕的事情,随后的两篇将会介绍通过依赖项来实现缓存数据的即时更新。希望大家捧场。

原文地址:https://www.cnblogs.com/liaods/p/9940404.html

时间: 2024-10-07 02:24:02

深入System.Web.Caching命名空间 教你Hold住缓存管理(一)的相关文章

深入System.Web.Caching命名空间 教你Hold住缓存管理(二)

本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法.看完之后你将学会: 第一篇-如何实现简单的数据缓存 第二篇-缓存从文件中读取的数据,并通过文件依赖实现缓存数据的及时更新 第三篇-缓存数据库中的整张表,并通过数据库依赖实现缓存数据的及时更新 在学习了第一篇Cache类的用法后,下面我们来继续看看如果缓存从文件中读取的的数据,并通过缓存依赖类CacheDependency实现缓存数据的及时更新. 一,缓存依赖类CacheDepen

System.Web.Caching

System.Web.Caching 本文转载自 宋辉 缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 本章从缓存所在的命名空间“System.Web.Caching”开始,详细介绍框架提供的缓存类和操作方法,主要涉及简单数据的缓存.数据缓存依赖和数据库缓存依赖三个技术要点,最后演示一个完全使用缓存实现数据读取的实例. 16.1  System.Web.C

System.Web.Caching.Cache类 缓存 各种缓存依赖

System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用

System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用于缓存的字节数. Item 获取或设置指定键处的缓存项. 二.方法 方法

System.Web.Caching.Cache类 缓存 各种缓存依赖(转)

转自:http://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例.尽量使用前者. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物

vs2012找不到system web optimization命名空间

今天新装了vs2012,安装完成后,创建了一个mvc4应用程序,创建生成出现了几个错误.通过错误我们的解决方案就是去找引用不到的路径,如何在vs2012中实现呢? 在工具栏中找工具--库程序包管理器---程序包管理器控制台 完成后下方会出现一个控制台框.在控制台中输入 Install-Package Microsoft.AspNet.Web.Optimization 回车,即可将未引用的程序集下载下来.目前我只完成到这一部,可是通过项目 添加引用总是不成功,不知道为啥.求指教. vs2012找不

关于System.Web.Caching的“未将对象引用设置到对象的实例”错误

初接触Asp.Net不久,想在后端做个缓存机制,于是使用了System.Web.Caching的Cache类. 使用部分的逻辑很简单,但是取值时总报错 private static Cache cache = new Cache(); public static string LoadCache(string Key)        {            if (cache[Key] == null)//这一步报错            {                return nul

System.Web.Caching.Cache

此类是利用缓存来保存信息的.可以把一些稳定的数据,不会随用户而改变的信息利用Cache保存起来,可以优化网站的速度. Cache和Session,cookie的区别 Session保存在服务器上,每个用户都有自己的Session,不会冲突,关闭网站后该Session丢失. Cookie是保存在客户端的,如果不清除流浪器的cookie或者不设置过期时间,cookie都不会丢失. Cache是分配在服务器上的一个公共的内存片.从Cache中读取数据比较快,有些网站就把一些经常被使用的数据放到Cach

Python Web开发:教你如何解放路由管理,新手教程!

如何解放路由管理 痛点 随着业务的飞速发展,API接口越来越多,路由管理文件从几十号变成几百上千行,且每次上新服务,需要在修改路由文件代码,带来一定的风险. 解决方案 既然路由文件随着业务的扩展越来越庞大,那就去掉路由文件.制定对应规则,路由通过API文件名根据一定的规则对应类名,然后自动导入对应实现类,注册到Web框架中.2.1 制定规则 下面这套规则只是其中一种方案,可以针对项目情况制定对应的规则,然后实现相关代码,但是整体思路基本一样. 代码目录结构,列一下简单的项目文件目录,下面以fla