ASP.NET 缓存 Cache

ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象. 缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存。

将数据添加到缓存中

1。通过指定其键和值将项添加到缓存中 Cache["txt"] = "a";

2.通过使用 Insert(重载Insert方法)方法将项添加到缓存中

Cache.Insert("txt", "a");

下列代码显示如何设置相对过期策略。它插入一个项,该项自上次访问后 10 分钟过期。注意 DateTime.MaxValue 的使用,它表示此项没有绝对过期策略。

DateTime absoluteExpiration=DateTime.MaxValue; TimeSpan slidingExpiration=TimeSpan.FromMinutes(10); Cache.Insert("txt", "a",null, absoluteExpiration,slidingExpiration, System.Web.Caching.CacheItemPriority.High,null);

3.使用 Add 方法将项添加到缓存中 Add 方法与 Insert 方法具有相同的签名,但它返回表示您所添加项的对象

DateTime absoluteExpiration=DateTime.MaxValue; TimeSpan slidingExpiration=TimeSpan.FromMinutes(10); Object  Ojb=(string)Cache.Add("txt","a",null, absoluteExpiration ,slidingExpiration , System.Web.Caching.CacheItemPriority.High,null); string str=(string)Ojb ; Response.Write(str);

结果显示是"a"

Add 方法使用上没有Insert 方法灵活,使用Add 方法时必须提供7个参数,Insert 方法重载4次,我们可以根据需要选择适当重载方法

从缓存中取得数据

方式1: string str=(string)Cache.Get("txt"); Response.Write(str);

方式2: string str1=(string)Cache["txt1"]; Response.Write(str1);

查看Cache中所有数据

System.Text.StringBuilder sb=new System.Text.StringBuilder("",100); foreach(DictionaryEntry Caches  in Cache) { sb.Append("key=").Append(Caches.Key.ToString()).Append(" ") ; sb.Append("value=").Append(Caches.Value.ToString()).Append(" "); } Response.Write(sb.ToString());

查看Cache中的项数 int Count=Cache.Count; Response.Write(Count.ToString());

将数据从缓存中删除 Cache.Remove("txt");

使Cache具有文件依赖项或键依赖项的对象

我们在一页面建立1个按钮,查看CACHE是否存在 在窗体启动时我们创建CACHE,名称="txt2",数值=数据集ds 该CACHE与myfile.xml相关联,当myfile.xml文件变化时,txt2CACHE就被自动删除

private void Page_Load(object sender, System.EventArgs e) { if( !IsPostBack  ) { string FilePath=MapPath("myfile.xml"); SqlConnection con=new SqlConnection("Uid=sa;database=pubs;"); SqlDataAdapter da =new SqlDataAdapter("select * from authors",con); DataSet ds=new DataSet(); da.Fill(ds); System.Web.Caching.CacheDependency CacheDependencyXmlFile=new System.Web.Caching.CacheDependency(FilePath); Cache.Insert("txt2",ds ,CacheDependencyXmlFile); } }

为了监视pubs数据库authors表的变化 我们可以在pubs数据库authors表建立触发器 一旦authors表中发生增加,删除,修改数据时,触发器会自动修改文件myfile.xml 一旦myfile.xml文件变化,txt2CACHE就被系统自动删除

CREATE TRIGGER tr_authors ON authors FOR INSERT, UPDATE ,delete AS declare @cmd nvarchar(4000) select @cmd='bcp "select convert(nvarchar(30),Getdate(),13)" queryout D:\cache\WebCache\myfile.xml -c -Sglc2403 -Usa -P' exec master..xp_cmdshell @cmd GO

private void QueryButton_Click(object sender, System.EventArgs e) { if ( Cache["txt2"]!=null) { Response.Write("exists"); } else { Response.Write("not exists"); } }

首先我们点按钮,显示Cache["txt2"]存在 现在我们去表authors中任意修改一数据,再点按钮,显示Cache["txt2"]不存在拉

以上我们是把CACHE是和一个文件相关联,我们还可以把CACHE和文件组关联,建立依赖 以下我们把CACHE和2个文件(myfile.xml,myfile1.xml)关联,一旦文件组中其中任意一文件变化,Cache会把"txt2"项的数据从CACHE中删除

string[] FilePath=new String[]{MapPath("myfile.xml"),MapPath("myfile1.xml")}; System.Web.Caching.CacheDependency CacheDependencyXmlFile=new                     System.Web.Caching.CacheDependency(FilePath); string CacheVaule="a"; Cache.Insert("txt2", CacheVaule ,CacheDependencyXmlFile);

缓存依赖可以是文件,还可以是其他对象的键 下面的代码说明缓存Cache["txt2"]既依赖文件myfile.xml,又依赖缓存中的Cache["txt"],只要这2者任意一样改变,缓存Cache["txt2"]就会清除

Cache["txt"] = "b"; string[] FilePath=new String[]{ MapPath("myfile.xml")}; string[] dependencyKey=new String[]{"txt"}; SqlConnection con=new SqlConnection("Uid=sa;database=pubs;"); SqlDataAdapter da =new SqlDataAdapter("select * from authors",con); DataSet ds=new DataSet(); da.Fill(ds); System.Web.Caching.CacheDependency CacheDependencyXmlFile= new System.Web.Caching.CacheDependency(FilePath,dependencyKey); Cache.Insert("txt2",ds ,CacheDependencyXmlFile);

缓存绝对过期

缓存Cache["txt3"] 在1小时后自动过期 DateTime absoluteExpiration =DateTime.Now.AddHours(1); Cache.Insert("txt3","aa",null,absoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration);

缓存相对(滑动)过期

注意:如果创建的弹性到期时间小于零或大于一年,则将引发异常 缓存Cache["txt4"] 在最后一次被访问后1小时自动过期 TimeSpan slidingExpiration=TimeSpan.FromHours(1); Cache.Insert("txt4","4",null,System.Web.Caching.Cache.NoAbsoluteExpiration,slidingExpiration);

缓存项的优先等级

当承载 ASP.NET 应用程序的 Web 服务器缺少内存时,Cache 将有选择地清除项来释放系统内存。当向缓存添加项时,可以为其分配与缓存中存储的其他项相比较的相对优先级。在服务器处理大量请求时,分配了较高优先级值 的项被从缓存删除的可能性较小,而分配了较低优先级值的项则更有可能被删除。 由CacheItemPriority 枚举表示,默认为 Normal。

缓存Cache["txt5"]优先等级设为最高等级,在服务器释放系统内存时,该缓存项最不可能被删除。 Cache.Insert("txt5","5",null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High,null);

缓存项时通知应用程序的回调方法

ASP.NET 提供 CacheItemRemovedCallback 委托。它定义编写事件处理程序时使用的签名,当从缓存中删除项时,该事件处理程序将进行响应。

static System.Web.Caching.CacheItemRemovedReason reason; System.Web.Caching.CacheItemRemovedCallback onRemove = null;

public void RemovedCallback(String k, Object v, System.Web.Caching.CacheItemRemovedReason r) { itemRemoved = true; reason = r; }

onRemove = new System.Web.Caching.CacheItemRemovedCallback (this.RemovedCallback); Cache.Insert("txt",ds,null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default,onRemove);

由于任何原因从Cache中移除时,将调用 RemovedCallback 方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

C# 获取 PC 序列号

在 C++ 需要使用 GetSystemFirmwareTable 的方法来获得 PC 的序列号,需要写的代码很多,但是在 C# 可以使用 WMI 来拿到序列号

27410
来自专栏恰童鞋骚年

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

  关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认识即可。

12630
来自专栏林德熙的博客

C# 如何写 DEBUG 输出

经常在代码中,需要使用 DEBUG 来输出一些奇怪的东西来进行测试。但是输出的窗口只有一个,如果有一个逗比在不停输出,那么就会让输出窗口看不到自己的内容。

15320
来自专栏ZKEASOFT

纸壳CMS的插件加载机制

纸壳CMS是基于插件化设计的,可以通过扩展插件来实现不同的功能。如何通过插件来扩展,可以参考这篇文章:

12120
来自专栏跟着阿笨一起玩NET

C#.Net前台线程与后台线程的区别

 if (!this.IsDisposed ) 也是可以的。判断当前窗体是否已经释放。(备注:释放的窗体是不能操作界面UI元素的。)

32510
来自专栏GreenLeaves

WCF系列教程之消息交换模式之请求与答复模式(Request/Reply)

1、使用WCF请求与答复模式须知 (1)、客户端调用WCF服务端需要等待服务端的返回,即使返回类型是void (2)、相比Duplex来讲,这种模式强调的是客户...

233100
来自专栏跟着阿笨一起玩NET

.Net中的5种事务总结

8110
来自专栏跟着阿笨一起玩NET

System.Threading.Tasks.Task引起的IIS应用程序池崩溃

2. 从服务器端看(Windows Server 2008 + IIS 7.0),在事件日志中会出现Event ID为5010的错误:

29320
来自专栏菩提树下的杨过

.net中的认证(authentication)与授权(authorization)

注:这篇文章主要给新手看的,老手们可能会觉得没啥营养,就请绕过吧。 “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 认证(authenticat...

376100
来自专栏码农阿宇

EF Core利用Transaction对数据进行回滚保护

What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用...

37950

扫码关注云+社区

领取腾讯云代金券