技术开发 频道

依赖文件的缓存过期机制的分析

IT168 技术文档】

    情况一,依赖于一个文件的缓存

    先来看一段代码, 我们实现了一个依赖文件的过期缓存:

protected void Page_Load(object sender, EventArgs e) ...{ System.Web.Caching.Cache c = HttpRuntime.Cache; string key = "123"; object o = c[key]; if (o == null) ...{ c.Insert(key, System.DateTime.Now, new System.Web.Caching.CacheDependency("C:\\111.txt")); Response.Write(" Cache Insert "); } else ...{ Response.Write(string.Format( " Cache Value : {0}",o)); } }

    通过测试可以看到,CacheDependency 传入的参数可以是一个完全不存在的文件路径,当然也可以是存在的文件路径。这两种情况都可以正常使用。不会有任何错误或者异常发生。

    如果传入的参数是不存在的文件路径,当这个文件被新创建的时候,或者被其他文件名重命名为这个文件名的时候,会自动把缓存过期。如果传入的参数文件已经存在了,当你删除这个文件的时候,缓存也会自动过期。当然,如果你修改这个文件的时候,缓存也会过期的。

    情况二,依赖于多个文件的缓存

    上面是依赖一个文件的缓存机制,我们还可以实现依赖多个文件的缓存机制,这时候我们的演示代码就变成了:

c.Insert(key, System.DateTime.Now, new System.Web.Caching.CacheDependency( new string[]...{ "C:\\111.txt","C:\\22.txt","C:\\tmp\\22.txt"} ));

    这时候缓存过期机制是上述缓存过期机制的合计。它所依赖的任何一个文件被新建、修改、删除,都会触发缓存过期。需要注意的是:
    如果我们实际并不存在 C:\tmp 目录,在程序启动的时候,会报错误:

An exception of type 'System.Web.HttpException' occurred in System.Web.dll but was not handled in user code Additional information: Directory 'C:\tmp' does not exist. Failed to start monitoring file changes.

    但是,如果我们存在这个目录,程序启动起来后,删除这个目录,则会不报任何错误。

    特殊情况说明:C:\\tmp\\22.txt 这个文件存在,我们把 tmp 目录改名称 tmp12 目录,这时候缓存过期不会触发。


    情况三,依赖于多个文件以及目录的缓存

    除了依赖多个文件缓存机制外,我们还可以依赖目录的缓存机制。下面的演示代码是即依靠数个文件,也依靠一个目录。
当这些文件被新增、修改、删除,以及这个目录下任何文件被修改、新增、删除都会触发缓存的过期。注意:这个目录C:\tmp 被删除、修改目录名字 ,以及这个目录下新建目录,这个目录下修改目录,删除这个目录下的目录,都不会触发缓存过期。

c.Insert(key, System.DateTime.Now, new System.Web.Caching.CacheDependency( new string[]...{ "C:\\111.txt","C:\\22.txt","C:\\tmp"} ));

     总结:

    依赖文件的过期机制:所选择的文件,以及所选择的目录下文件发生新增、修改、删除等操作的时候,会导致过期发生。所选择的依赖文件可以不存在,但是所选择的依赖目录必须存在。其下的目录和自身的目录发生变化,不会触发缓存过期。

0
相关文章