.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,同时验证了回调的时机是不可预知的。

时间: 2025-01-02 04:05:27

.net缓存——基于文件的缓存的相关文章

霸气!Nginx 中缓存静态文件秘籍

导读 这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件.这样能节省带宽,并且在访问你的网站时会显得更快些(如果用户第二次访问你的网站,将会使用浏览器缓存中的静态文件). 1.准备事项 我想你需要一个正常工作的 nginx 软件,可以查看另一篇的帖子:在 Ubuntu 16.04 LTS 上安装 Nginx,P

如何在 nginx 中缓存静态文件

这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件.这样能节省带宽,并且在访问你的网站时会显得更快些(如果用户第二次访问你的网站,将会使用浏览器缓存中的静态文件). 1.准备事项 我想你需要一个正常工作的 nginx 软件,就像这篇教程里展示的:在 Ubuntu 16.04 LTS 上安装 Nginx,PHP

缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web应用中使用注解缓存,其实很简单,就是将springMVC配置文件与缓存注解文件一起声明到context中就OK了. 下面我就来构建一个基于spring注解小型的web应用,这里我使用EHCache来作为缓存方案 jar依赖: ehcache-core-1.7.

缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache

本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中提供对许多第三方缓存方案的支持,包括: EHCache OSCache(OpenSymphony) JCS GigaSpaces JBoss Cache 等等. 将这些第三方缓存方案配置在spring中很简单,网上有许多介绍,这里只重点介绍如何配置基于注解的缓存配置. 本文将通过例举EHCache和

关于更新发布CSS和JS文件的缓存问题

在Web应用程序大行天下的今天,我们程序员的工作大都基于B/S架构,B/S架构的优势就在于可以及时(甚至随时)更新页面以及后台逻辑,而不用通知客户去手动更新客户端.在这种环境下,是不是B/S架构的软件就真的没有升级的问题了呢? 现如今,浏览器大战下,各个浏览器也是拼了命的提高性能,升级JS解析引擎,更好的处理浏览器的页面缓存,让用户的浏览体验更快,占用更小的PC资源.那么,问题就出现在JS和CSS缓存,甚至页面缓存上.至于浏览器对页面的缓存,我们一般通过在服务端发送页面的时候设置页面的生存期,一

python 写文件刷新缓存

搞爬虫的时候,结果是通过file.write(strs)写入文件的. 带来的问题是,进程如果是被杀死的时候,最后一条结果总是缺损的,因为缓存的部分还未写入文件. 解决办法是每次写入文件时,都刷新缓存,直接将缓存数据全部写入文件: fi = open('file', 'wb') fi.write('strs') fi.flush() ...

apache下用expires_module让浏览器缓存静态文件

apache下用expires_module让浏览器缓存静态文件 apache配置静态缓存的原因: 第一点,       减轻服务器的压力. 第二点,       省去浏览器经常要去服务端下载CSS.JS.图片.静态文件等,减小不必要的网络IO. 配置步骤: 1. 在apache主配置文件中开启apache扩展模块mod_expires.so,命令: Vi /usr/local/apache2/conf/httpd.conf,如下图所示: 2. 配置缓存,在apache的虚拟主机(/usr/lo

NET Core静态文件的缓存方式

NET Core静态文件的缓存方式 阅读目录 一.前言 二.StaticFileMiddleware 三.ASP.NET Core与CDN? 四.写在最后 回到目录 一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述.当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容.

Ehcache——基于注解的缓存使用

ehcache是一个非常轻量级的缓存实现,而且从1.2之后就支持了集群,而且是hibernate默认的缓存provider.EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache的分布式缓存有传统的RMI,1.5版的JGroups,1.6版的JMS.分布式缓存主要解决集群环境中不同的服务器间的数据的同步问题. 使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存. CachingFilt