依赖文件的缓存过期机制的分析
【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"}
));
总结:
依赖文件的过期机制:所选择的文件,以及所选择的目录下文件发生新增、修改、删除等操作的时候,会导致过期发生。所选择的依赖文件可以不存在,但是所选择的依赖目录必须存在。其下的目录和自身的目录发生变化,不会触发缓存过期。
