Cache管理机制(System.Web.Caching)
一,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(), CacheItemPriority.Normal, null);
player[] = "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(), 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类的使用方法,并没有涉及缓存依赖的内容。
Cache管理机制(System.Web.Caching)的更多相关文章
- System.Web.Caching.Cache 方法汇总
在做后台的时候,想着把所有栏目放到缓存里,就这里了一个类.必然是有缺陷,暂时没有实现滑动缓存 using System; using System.Collections; using System. ...
- 深入System.Web.Caching命名空间 教你Hold住缓存管理
一,System .Web.Caching与缓存工作机制简介 System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站的开发,包 ...
- System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.C ...
- System.Web.Caching.Cache类 缓存 各种缓存依赖(转)
转自:http://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntime ...
- System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖
Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的 ...
- C# System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:https://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntim ...
- System.Web.Caching.Cache类 缓存
1.文件缓存依赖 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender ...
- 清除 System.Web.Caching.Cache 以"xxx"开头的缓存
public static void ClearStartCache(string keyStart) { List<string> cacheKeys = new List<str ...
- 第一节:从程序集的角度分析System.Web.Caching.Cache ,并完成基本封装。
一. 揭开迷雾 1. 程序集准备 a. 需要给项目添加 System.Web 程序集. b. 需要给使用的地方添加两个引用. 2. 程序集探究 在对应的类中输入关键字 Cache,选中点 ...
随机推荐
- VMware15.5版本通过挂载系统光盘搭建yum仓库
VMware15.5版本通过挂载系统光盘搭建yum仓库一.1.打开CentOS 7虚拟机. 2.登录虚拟机,选择未列出 用户名:root 密码:输入自己设置的密码 点击登录. 3.右键单击打开终端. ...
- MSF MS12-020RDP漏洞攻击
Metasploit利用远程桌面协议RDP拒绝访问漏洞(MS12-020) 漏洞描述:BUGTRAQ ID: 52354 CVE ID: CVE-2012-0152 远程桌面协议(RDP, Remot ...
- 一小部分用python进行MD5加密的小技巧
上个图 要求计算出开头为ae3da且盐值为3c6e的字符串 简单的思路就是直接进行枚举,然后筛选符合条件的MD5加密字符,代码如下 #-*- coding:utf- -*- import hashli ...
- 一套兼容win和Linux的PyTorch训练MNIST的算法代码(CNN)
第一次,调了很久.它本来已经很OK了,同时适用CPU和GPU,且可正常运行的. 为了用于性能测试,主要改了三点: 一,每一批次显示处理时间. 二,本地加载测试数据. 三,兼容LINUX和WIN 本地加 ...
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'qingmu' for key 'PRIMARY'
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolatio ...
- Thinkphp下实现D函数用于实例化Model格式
* D函数用于实例化Model 格式 项目://分组/模块 * @param string $name Model资源地址 * @param string $layer 业务层名称 * @return ...
- 06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
上篇文章中,我们只看到了 dio 的使用方式,但并未跟应用关联起来,所以这一篇将 dio 网络请求与应用界面结合起来,当然这也是为以后的实战作基础准备,基础打牢,我们才能飞速前进. 1.案例说明 我们 ...
- fibnacci数列递归实现
斐波那契数列 Fibonacci sequence又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列" ...
- rust-vmm 学习(二)
eventfd virtio中,guest和vhost通过evnetfd通知对方,见(Virtio ring and virtio-net). REF: Qemu-kvm的ioeventfd创建与触发 ...
- 微信小程序轮播组件
在index.wxml中添加以下代码 <view> <swiper indicator-dots="{{indicatorDots}}" autoplay=&qu ...