欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-01-21 21:23:28
      一,.net中的缓存基础知识       .net中支持的两种依赖:  ...

 

 

 

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

 

 

 

.net中支持的两种依赖:

 

cachedependency

sqldependency

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

表示对于sql的依赖

 

 

过期时间

 

绝对过期时间

滑动过期时间

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

 

一个时间间隔,类型为timespan

 

 

 

优先级 : cacheitempriority

 

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

 

 

删除通知

 

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

 

 

 

特别注意:

 

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

 

 

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

 

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

 

 

 

 

二,基于文件的缓存示例

 

 

 

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

 

 

 

首先在测试页面上加个label:

 

 

  asp:label id="label1" runat="server" text="">

 

接着,加入缓存管理类:

 

 

 

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;
            }
        
        }


        /// 
        /// callbacks the specified key.
        /// 
        ///the key.
        ///the value.
        ///the reason.
        /// editor:v-liuhch createtime:2015/5/26 20:13:22
        private static void callback(
            
            string key,
            object value,
            system.web.caching.cacheitemremovedreason reason
            //原因
            ) {

                if (reason == system.web.caching.cacheitemremovedreason.expired)
                {
                   httpruntime.cache.insert("message","时间已到,缓存已过期");
                    
                }
                }
           
        
        }

}

 

 

这里,区别下cache的add方法和insert方法:

 

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

 

 

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

 

 

 protected void page_load(object sender, eventargs e)
        {
                this.label1.text = cachemanager.message;   //获取缓存

        }

 

 

 

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

 

 

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

 

 

 

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

 

 

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