HttpContext.Current.Cache 过期时间
為了更快的讀取數(shù)據(jù),我們一般會(huì)把常用到的數(shù)據(jù)加載到Cache中
在.NET中,Cache的存在可以依賴多中方式,主要用到HttpContext.Current.Cache類
在這里,我主要寫(xiě)幾種依賴方式
1:不依賴任何條件
HttpContext.Current.Cache.Insert(string cacheName,object obj)
理論上是Cache會(huì)永久保存,但是當(dāng)服務(wù)器重新啟動(dòng),內(nèi)存緊張的時(shí)候也會(huì)丟失.
2:HttpContext.Current.Cache.Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);
//CacheDependency緩存依賴項(xiàng),absoluteExpiration絕對(duì)過(guò)期時(shí)間,slidingExpiration最后一次訪問(wèn)的時(shí)間隔
//我們主要講兩種Cache依賴
2.1:文件依賴,so simple//只要文件改動(dòng),Cache移出
HttpContext.Current.Cache.Insert(cacheName,ojb, new System.Web.Caching.CacheDependency(FilePath));
2.2:SqlServer數(shù)據(jù)庫(kù)依賴//我這里是SQL2005
首先看數(shù)據(jù)庫(kù)通知是否可用,記得一定要開(kāi)啟通知
Select DATABASEpRoPERTYEX('數(shù)據(jù)庫(kù)名','IsBrokerEnabled');如果值為1表示可用
alter database Game176Admin set ENABLE_BROKER ;//開(kāi)啟
alter database Game176Admin set DISABLE_BROKER;//關(guān)閉
在Global.asax文件中,我們?cè)趹?yīng)用程序開(kāi)始和結(jié)束時(shí)要做一些事情
void Application_Start(object sender, EventArgs e)
{
// 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼
try
{
System.Data.SqlClient.SqlDependency.Start(string strCon);//開(kāi)啟
}
catch { }
}
void Application_End(object sender, EventArgs e)
{
// 在應(yīng)用程序關(guān)閉時(shí)運(yùn)行的代碼
try
{
System.Data.SqlClient.SqlDependency.Stop(string strCon);
}
catch { }
}
準(zhǔn)備工作已經(jīng)完成
我們先寫(xiě)一個(gè)方法,添加數(shù)據(jù)庫(kù)依賴
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);
}
}
//上面這個(gè)方法是告訴數(shù)據(jù)庫(kù),當(dāng)你指定表數(shù)據(jù)改變,要移出緩存
我們現(xiàn)在可以來(lái)添加了
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語(yǔ)句中用到的表,只要這些表中的任何數(shù)據(jù)有改動(dòng),數(shù)據(jù)庫(kù)都會(huì)通知,這時(shí)緩存會(huì)移動(dòng),select的字段和Cache沒(méi)有關(guān)系,只有表名有關(guān)系,所有你要選擇最小的字段.很多時(shí)候,為了這個(gè)字段,在設(shè)計(jì)表的時(shí)候都為多加一個(gè)最小的依賴列.
NOTE:任何Cache都可能丟失,使用前一定要做必要的檢查,如:
MyObject obj=HttpContext.Current.Cache("CacheName") as MyObject;
if(null==obj)
{
obj=.......
HttpContext.Current.Cache.Insert("CacheName",obj);
}
Cache用法之頁(yè)面聲明
<%@ outputCache
Duration="#ofseconds"
Location="Any|Client|Downstream|Server|None"
VaryByControl="ControlName"
VaryByCustom="browser|customstring"
VaryByHeader="headers"
VaryByParam="Parametername" %>
Cache用法之代碼控制
HttpCachePolicy類是專門(mén)用來(lái)控件Cache的,可以用Response.Cahce來(lái)訪問(wèn)這個(gè)類的實(shí)例
Response.Cache.SetExpires(DateTime.Now.AddSeceonds(10));
Response.Cache.SetCacheability(HttpCacheablility.Public);
Response.Cache.SetValidUnitlExpires(true);
-----------------------以上都是緩存頁(yè)面的,下面是緩存數(shù)據(jù)的----------------------------
Cache 類的生存周期等于應(yīng)用程序的生命周期
三種用法
1:存:Cache["key"] = MyData;取:
MyData = Cache["key"];
if(MyData != null)
use(MyData);
此法存入Cache的數(shù)據(jù)生命周期等于應(yīng)用程序生命周期,不支持清除、過(guò)期、依賴性等功能。
2:存:
Cache.Insert(
string key,
object value,
CacheDependency dependencies,//依賴,設(shè)置緩存有效的依賴性,比如設(shè)置和一個(gè)文件相關(guān),文件一變,就失效
DateTime absoluteExpireation, //設(shè)置固定的過(guò)期時(shí)間
TimeSpan slidingExpiration, //設(shè)置最后一次訪問(wèn)后多長(zhǎng)時(shí)間過(guò)期
CachePriority priority, //設(shè)置內(nèi)存不足,緩存自動(dòng)清除時(shí),緩存的重要性,可不可以清除
CacheItemRemovedCallback onRemoveCallback // 設(shè)置在清除時(shí)引發(fā)的事件
)
Example:
Cache.Insert("Mydata",MyData,new Caching.CacheDependency(Server.MapPah("Mydata.XML")));//設(shè)置有效性和一個(gè)文件有關(guān)
Cache.Insert("Mydata",myData,null,DateTime.Now.AddDays(1),Cache.NoSlidingExpiratin);//兩種過(guò)期時(shí)間設(shè)了其中一種,另一種要設(shè)為0,用NoAbsolute(Sliding)Expiration枚舉
Cache.Insert("MyData",myData,null,Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(10));//不能過(guò)一年不能小于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差不多,區(qū)別在于Add碰到該key原來(lái)有賦過(guò)值會(huì)失敗,Insert則不會(huì),而會(huì)替換原有值;Add會(huì)返回被緩存數(shù)據(jù)項(xiàng),Insert不會(huì) ?
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/4884630.html
總結(jié)
以上是生活随笔為你收集整理的HttpContext.Current.Cache 过期时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle中的备注的配置与查询
- 下一篇: 理解盒子模型