设计模式(7)——单例模式(2)——单例模式案例:文件读取缓存管理器

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负责“算”, 内存负责“存”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值