赞
踩
1、FileCacheManager,根据文件名读取文件内容,提供一个方法string ReadFile(string filename),参数是文件名,返回值为文件内容。
2、如果每次都读取文件太慢了,内存的读写速度比硬盘读写速度快,因此第一次读取文件以后将文件内容放到内存缓存中,再读取的只要去缓存中读取文件内容就可以。这也是ASP.Net中Cache等的原理。
3、ReadFile改造后实现算法:到缓存中查看filename是否在内存缓存中,如果在缓存中则直接将缓存中的文件内容返回;如果不在缓存中则到硬盘中读取文件内容,将读取到的文件内容放到缓存中,最后将文件内容返回给调用者。
4、LRU缓存,不是所有数据都放到缓存中,有一个缓存的最大大小,比如最大就放100条缓存,缓存中只存放最常用的100条。就是根据缓存项被访问的频率。每次新增缓存项的时候,如果缓存已经满了,那么就从缓存的数据中挑出一个被访问次数最少的缓存踢出去,然后新加入的替换他的位置。
5、学习这的好处(目的): (1)理解什么是单例。(2)理解什么是缓存,对以后学习asp.net有帮助。
6、缓存主要包括两个:内容和修改时间。
7、缓存的实现:因为不止一个文件需要缓存,因此需要标识缓存的文件名,用Dictionary<string, string>做缓存的储存,key为文件名,value为文件的内容。
8、照着算法实现吧!(有并发的缺陷,暂时不用关心) 。
9、性能测试,用Stopwatch比较不用缓存和用缓存两个版本读取一个文件1W、5W、10W次的耗时。结论是?为什么?
10、FileCacheManager目前的实现的一个缺陷是文件缓存以后,如果文件内容变化读取的还是旧内容,需要修改缓存的失效(失效就是缓存中的数据和实际的数据不一致了,缓存应该在数据失效后立即更新缓存)策略:文件修改后缓存失效。文件被修改了重新读取新内容。
11、如何判断文件是否被修改了:
(1)每次修改文件的时候都会更新文件的修改时间,查看文件修改时间的方法,文件的属性→修改时间,使用File.GetLastWriteTime读取文件的修改时间。
(2)ReadFile方法中读取文件的修改时间,与缓存的文件内容的修改时间比较,如果不同就说明文件修改了。
12、如何取得缓存的文件内容的修改时间?需要在缓存的时候将缓存的时候文件的修改时间放到一个地方,和文件内容放到一起最合适,因此设计一个类FileCacheData,包含文件内容Content、LastWriteTime两个属性,缓存的Key由string改为FileCacheData。
13、常见问题:怎么先执行下边再执行上面。
14、CPU和内存之间的分工很明确: CPU负责“算”, 内存负责“存”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。