.net缓存——基于文件的缓存

一,.Net中的缓存基础知识



.net中支持的两种依赖:

 

CacheDependency

SqlDependency

表示对于文件或者目录的依赖

表示对于SQL数据库的依赖

 

 

过期时间


绝对过期时间

滑动过期时间

一个特定的时间点,类型为DateTime

 

一个时间间隔,类型为TimeSpan

 

 

 

优先级  :   CacheItemPriority


         由于我们需要缓存大量的数据,在内存有限的情况下,就必须对缓存的数据进行优先级分类,以便在需要的时候,将不重要的数据从缓存中移除。优先级用来指定缓存数据的重要性,重要的数据可以更长时间地保存在内存中。

 

 

删除通知


        当被缓存的数据从内存中移除的时候,可以提供一个通知机制,来回调用户定义的方法,方法必须符合CacheItemRemovedCallback委托的定义。。

 

 

 

特别注意:


         1,回调的时机是不可预知的,不能假定回调发生时,回调方法的执行线程存在HttpContext的上下文,为了在没有请求上下文的时候取得对Cache对象的引用,可以通过HttpRuntime的cache属性来使用应用程序的cache.

 

 

         2,不能在页面上使用实例方法来作为回调方法,挡在页面上使用回调方法时,由于指向回调方法的引用会阻止垃圾回收机制,因此会造成内存很快耗光。

 

         3,一般通过在自定义类的静态方法实现回调方法,或者使用页面对象的静态方法实现。





二,基于文件的缓存示例





首先在 测试 页面上加个label:
<asp:Label Text="" runat="server" id="label1"/>  
接着,加入缓存管理类:
<span style="font-size:14px;">namespace 基于文件的缓存依赖  
{  
    public class CacheManager  
    {  
        public static string Message {  
  
            get {  
                HttpContext context = HttpContext.Current;  
  
                //首先从缓存中获取  
                string message = context.Cache["Message"] as string;  
  
                //如果缓存中没有数据  
                if (message==null)  
                {  
                    string path = context.Server.MapPath("TestFileCache.txt");  
                    message = System.IO.File.ReadAllText(path);  
  
                    //将信息保存到缓存中,设置响应的过期时间为1分钟  
                    context.Cache.Add(  
                        "Message",  
                        message,  
                        new System.Web.Caching.CacheDependency(path),//依赖于文件或者目录的依赖  
                        System.Web.Caching.Cache.NoAbsoluteExpiration,//不使用绝对过期时间  
                        new TimeSpan(0, 0, 5),//缓存的时间  
                        System.Web.Caching.CacheItemPriority.Normal, //缓存的优先级  
                        Callback); //过期时的回调  
                      
                }  
  
                return message;  
            }  
          
        }  
  
  
        /// <summary>  
        /// Callbacks the specified key.  
        /// </summary>  
        /// <param name="key">The key.</param>  
        /// <param name="value">The value.</param>  
        /// <param name="reason">The reason.</param>  
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/26 20:13:22</remarks>  
        private static void Callback(  
              
            string key,  
            Object value,  
            System.Web.Caching.CacheItemRemovedReason reason  
            //原因  
            ) {  
  
                if (reason == System.Web.Caching.CacheItemRemovedReason.Expired)  
                {  
                   HttpRuntime.Cache.Insert("Message","时间已到,缓存已过期");  
                      
                }  
                }  
             
          
        }  
  
}</span>  


这里,区别下cache的Add方法和Insert方法:


      在调用Add的时候,如果要加入的缓存项存在的话,则会调用失败;但是如果用insert插入,则新插入的value值会覆盖掉原来的value值。



     在webform1中,加入一行测试下:

protected void Page_Load(object sender, EventArgs e)  
       {  
               this.label1.Text = CacheManager.Message;   //获取缓存  
  
       }  




 可以看到已经读到文件中的内容了,因为设置的是5s后过期,所以5s后我们刷新下:



但是多次测试我们会发现,刷新后出现过期的准确时间并不是5s,同时验证了 回调的时机是不可预知的





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值