HttpContext.Current.Cache 过期时间
原文:HttpContext.Current.Cache 过期时间

为了更快的读取数据,我们一般会把常用到的数据加载到Cache中

在.NET中,Cache的存在可以依赖多中方式,主要用到HttpContext.Current.Cache类

在这里,我主要写几种依赖方式

1:不依赖任何条件

HttpContext.Current.Cache.Insert(string cacheName,object obj)

理论上是Cache会永久保存,但是当服务器重新启动,内存紧张的时候也会丢失.

2:HttpContext.Current.Cache.Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

//CacheDependency缓存依赖项,absoluteExpiration绝对过期时间,slidingExpiration最后一次访问的时间隔

//我们主要讲两种Cache依赖

2.1:文件依赖,so simple//只要文件改动,Cache移出

HttpContext.Current.Cache.Insert(cacheName,ojb, new System.Web.Caching.CacheDependency(FilePath));

2.2:SqlServer数据库依赖//我这里是SQL2005

首先看数据库通知是否可用,记得一定要开启通知

Select DATABASEpRoPERTYEX('数据库名','IsBrokerEnabled');如果值为1表示可用

alter database Game176Admin set ENABLE_BROKER ;//开启
alter database Game176Admin set DISABLE_BROKER;//关闭

在Global.asax文件中,我们在应用程序开始和结束时要做一些事情

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
try
{
System.Data.SqlClient.SqlDependency.Start(string strCon);//开启
}
catch { }
}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
try
{
System.Data.SqlClient.SqlDependency.Stop(string strCon);
}
catch { }
}

准备工作已经完成

我们先写一个方法,添加数据库依赖

void AddSqlDependency(string strCon, string strSql, OnChangeEventHandler sqlDep_OnChange)
{
try
{
using (SqlConnection conn = new SqlConnection(strCon))
{
SqlCommand comm = new SqlCommand(strSql, conn);
SqlDependency sqlDep = new SqlDependency(comm);
sqlDep.OnChange += sqlDep_OnChange;
if (conn.State == ConnectionState.Closed) conn.Open();
comm.ExecuteNonQuery();
}
}
catch (Exception ex)
{
LogUtility.Add(ex);
}
}

//上面这个方法是告诉数据库,当你指定表数据改变,要移出缓存

我们现在可以来添加了

MyObject obj= HttpRuntime.Cache["cacheName"] as MyObject;
if (null == obj)
{
try
{
obj= GetObj(...);
}
catch (Exception ex)
{
LogUtility.Add(ex);
obj= null;
}
if (null != obj)
{
AddSqlDependency(strCon, "select id from dbo.tableName;select id1 from dbo.tableName1",
delegate(object sender, SqlNotificationEventArgs e)
{
//do something

HttpRuntime.Cache.Remove("cacheName");
});
HttpRuntime.Cache.Insert("cacheName", obj);
}
}

上面SQL语句中用到的表,只要这些表中的任何数据有改动,数据库都会通知,这时缓存会移动,select的字段和Cache没有关系,只有表名有关系,所有你要选择最小的字段.很多时候,为了这个字段,在设计表的时候都为多加一个最小的依赖列.

NOTE:任何Cache都可能丢失,使用前一定要做必要的检查,如:

MyObject obj=HttpContext.Current.Cache("CacheName") as MyObject;

if(null==obj)

{

obj=.......

HttpContext.Current.Cache.Insert("CacheName",obj);

}
Cache用法之页面声明

<%@ outputCache
Duration="#ofseconds"
Location="Any|Client|Downstream|Server|None"
VaryByControl="ControlName"
VaryByCustom="browser|customstring"
VaryByHeader="headers"
VaryByParam="Parametername" %>

Cache用法之代码控制
HttpCachePolicy类是专门用来控件Cache的,可以用Response.Cahce来访问这个类的实例

Response.Cache.SetExpires(DateTime.Now.AddSeceonds(10));
Response.Cache.SetCacheability(HttpCacheablility.Public);
Response.Cache.SetValidUnitlExpires(true);

-----------------------以上都是缓存页面的,下面是缓存数据的----------------------------
Cache 类的生存周期等于应用程序的生命周期
三种用法
1:存:Cache["key"] = MyData;取:
MyData = Cache["key"];
if(MyData != null)
use(MyData);
此法存入Cache的数据生命周期等于应用程序生命周期,不支持清除、过期、依赖性等功能。

2:存:
Cache.Insert(
string key,
object value,
CacheDependency dependencies,//依赖,设置缓存有效的依赖性,比如设置和一个文件相关,文件一变,就失效
DateTime absoluteExpireation, //设置固定的过期时间
TimeSpan slidingExpiration, //设置最后一次访问后多长时间过期
CachePriority priority, //设置内存不足,缓存自动清除时,缓存的重要性,可不可以清除
CacheItemRemovedCallback onRemoveCallback // 设置在清除时引发的事件
)
Example:

Cache.Insert("Mydata",MyData,new Caching.CacheDependency(Server.MapPah("Mydata.XML")));//设置有效性和一个文件有关
Cache.Insert("Mydata",myData,null,DateTime.Now.AddDays(1),Cache.NoSlidingExpiratin);//两种过期时间设了其中一种,另一种要设为0,用NoAbsolute(Sliding)Expiration枚举
Cache.Insert("MyData",myData,null,Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(10));//不能过一年不能小于0
Cache.Insert("MyData",myData,null,Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(10),
Caching.CacheItemPriority.NotRemovable,null);
// AboveNormal|BelowNormal|Default|High|Low|Normal|NotRemovable

public void RemovedCallback(string key,object value,CacheItemRemovedReason reason)
{
if(reason == CacheItemRemovedReason.DependencyChanged)
Response.Write("文件变了,快去看看");
}
Cache.Insert("Mydata",MyData,new Caching.CacheDependency(Server.MapPah("Mydata.XML"),
DateTime.Now.AddDays(1),Cache.NoSlidingExpiration,CacheItemPriority.High,
new CacheItemRemovedCallback(this.RemovedCallback));

清除就可以用Cache.Remove("key");方法

3:
Cache.Add方法,用法和Insert差不多,区别在于Add碰到该key原来有赋过值会失败,Insert则不会,而会替换原有值;Add会返回被缓存数据项,Insert不会

posted on 2015-10-16 10:47 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4884630.html

HttpContext.Current.Cache 过期时间相关推荐

  1. Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

    在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...

  2. HttpContext.Current.Cache vs. HttpRuntime.Cache

    .NET中Cache有两种调用方式:HttpContext.Current.Cache 和 HttpRuntime.Cache,这两种方式有什么区别呢?我们先看MSDN上的解释:       Http ...

  3. HttpContext.Current.Cache和HttpRuntime.Cache的区别,以及System.Runtime.Caching

    先看MSDN上的解释:       HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象.       HttpRuntime.Cache:获取当前应用程序的C ...

  4. 缓存通用管理类 + 缓存 HttpContext.Current.Cache 和 HttpRuntime.Cache 的区别

    以前写asp.net时用HttpContext.Current.Cache存缓存很好用,今天写了一个windows服务程序,HttpContext.Current.Cache存缓存的时候还好,取的时候 ...

  5. HttpContext.Current.Cache在控制台下不工作

    说明: Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体 ...

  6. c# redis 如何设置过期时间_Spring cache整合Redis,并给它一个过期时间!

    小Hub领读: 不知道你们有没给cache设置过过期时间,来试试? 上一篇文章中,我们使用springboot集成了redis,并使用RedisTemplate来操作缓存数据,可以灵活使用. 我才懂! ...

  7. 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)...

    在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在 ...

  8. HttpContext.Current:异步模式下的疑似陷阱之源

    最近园子里首页有好几篇文章都是讲异步编程的,尤其是几篇讲博客园自身的异步化建设的文章,看了以后很有收获. 闲暇之余再重新查查资料温故知新学习一遍,重新认识了SynchronizationContext ...

  9. php redis hset过期时间,详解Redis中数据过期策略

    相信大家对Redis中数据过期有点了解,本文主要介绍了Redis中的数据过期策略,文中通过示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,希望能帮助到大家 ...

最新文章

  1. linux备份sqlserver数据库,Linux sqlServer数据库还原办法
  2. HTML-Label-框架-字符实体-全局属性-CSS基本语法结构
  3. python4k高清图片_第一次接触,尝试用python抓取国外4k高清图像数据,真方便
  4. [转载] PyTorch简介
  5. K8S集群模式下fluent-bit日志收集方案设计和实践
  6. angularJs-基础用法
  7. 2019年CVTE凉
  8. 华顺信安 白帽汇安全研究院二面复盘
  9. iimap服务器没有响应,解决imap被vimIM和谐掉的问题
  10. python输出字符串排列组合代码
  11. HANDLE是什么意思(怎么用)
  12. EPLAN_语言翻译工具的使用
  13. python基于PHP+MySQL的连锁酒店管理系统
  14. C++中goto的使用
  15. c语言中%p和0x%x,C语言中的%p和%x的区别
  16. 360手机n4s骁龙版 html,360手机N4S骁龙版:低价高配标杆
  17. cocos2dx-js 的配置和安装
  18. 人工智能成日照 87 所学校“必修课
  19. GNSS单点定位解算与原理(基于MATLAB)
  20. PCB中的生产工艺、USB布线、特殊部件、蓝牙天线设计

热门文章

  1. matlab 生成几个聚类点函数nngenc函数
  2. RNN代码解释pytorch
  3. Cities (思维 树)
  4. 使用Python操作MySQL数据库
  5. 模板—主席树(待修改)
  6. 不是同一个工程的exe与dll,如何调试dll
  7. 17、任务十六——事件委托机制、简单表单验证
  8. friend keyword 对于模板 并不只不过友元!!!
  9. [原创]敏捷管理实践看板思维导图
  10. Ubuntu 安装任意版本Django