《1》所谓缓存依赖,文件依赖就是指,我不我没有设置缓存的过期时间,当缓存依赖的文件内容发生改变的时候,就通知framework清空缓存。然后重数据库中取数据(或者文件中取数据)然后又把取到是数据缓存起来,用户请求的时候,直接从缓存中取数据,如果缓存依赖的文件内容又发生改变,就又清空,周而复始。。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Caching; using System.Web.Mvc; namespace Itcast.CMS.WebApp.Controllers { public class CacheTestController : Controller { Itcast.CMS.Common.LogHelper log = new Common.LogHelper();//log4net日记类对象 private static System.Web.Caching.Cache Cache = HttpRuntime.Cache; public ActionResult Index() { //如果可以为"fmsg"的缓存不存在,或为空,就去文件里取数据,否则就去缓存里取数据 if (Cache["fmsg"] == null) { //缓存要依赖的文件的路径(我这里写的是绝对路径,也可以写虚拟路径,到时候给它转成物理路径就可以了) string filePath = System.IO.Path.GetFullPath(@"D:\企业管理系统\Itcast.CMS\Itcast.CMS.WebApp\Log\LogInfo\2015-05-06.TXT"); //string filePath = Server.MapPath("~/master/wowo.txt"); //这段代码无缓存依赖没有关系,这里仅仅是将上面那个路径的文件读出来而已(到时候用作缓存的值,当然你也可以设置别的值,这里仅仅是做是案例而已) string msg = System.IO.File.ReadAllText(filePath,System.Text.Encoding.Default); //创建一个缓存依赖对象(并用缓存依赖文件的服务器端的物理路径给它初始化。只要文件的内容改变,它就会通知framework清空缓存 System.Web.Caching.CacheDependency cDep = new System.Web.Caching.CacheDependency(filePath); //第一个参数:缓存的键 //第二个参数:缓存的值 //第三个参数:缓存依赖的对象 //第四个参数:缓存的绝对过期时间,从用户第一次请求开始计时(因为这里我们是使用的缓存依赖,所以这里使用NoAbsoluteExpiration,表示没有到期时间,即永不过期) //第五个参数:缓存的可调过期时间,从用户最后一次请求开始计时(因为这里我们是使用缓存依赖,所以这里使用NoSlidingExpiration,表示没有可调过期时间) //第六个参数:指定 System.Web.Caching.Cache 对象中存储的项的相对优先级。(它是一个枚举) Normal是默认值 //第七个参数:缓存依赖的回调函数(缓存被清除或修改的时候调用此方法) //【其实第七个参数它是一个委托,既然它是一个委托,所以我们使用它的时候需要传递一个方法签名和这个委托签名一样的方法给它】 //Cache.Insert()方法也可以用Cache.Add()方法替代,只是Cache.Add()方法的参数个数比较多,有时候我们不需要那么多参数的时候就使用Cache.Insert(),比较方便 Cache.Insert("fmsg",msg,cDep,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.Normal,CacheCallBack); ViewData["msg"] = msg; } else { //如果key为“fmsg”的缓存存在数据,就将它赋值给ViewData["msg"] ViewData["msg"] = Cache["fmsg"].ToString(); } return View(); } /// <summary> /// 缓存依赖的回调函数(缓存被清除的时候调用此方法) /// </summary> /// <param name="key">缓存的键</param> /// <param name="value">缓存的值</param> /// <param name="reason">缓存被移除的原因</param> void CacheCallBack(string key,object value,CacheItemRemovedReason reason) { //是用logHelper对象来记录日记 log.Info("在Home控制器下的Index方法中,Cache[" + key + "]=" + value.ToString() + "因为"+reason.ToString()+"被删除了"); } } }