构思:
普通的文件下载上传需要反复的进行IO 操作,占用服务器虚拟内存好IO 线程较高,如果控制不好会导致CPU适用率一直占用率过高,本人在项目中遇到该问题,为解决该问题才有以下构思.
为了解决IO操作频繁IO线程占用过高,采用内存缓存文件(因此只能支持较小文件) ,那么采用缓存的时候就要考虑到文件的使用率和内存占用率的问题,为了解决文件使用率过低并占用内存的问题,采用文件使用心跳的检测文件的存活率,并对自定义的缓存器设置文件缓存上限,解决的文件存活率问题那么新的问题来了,如何辨认相同文件,相同文件是否需要缓存两份,因此采用的文件MD5加密获取文件MD5字符串作为缓存键来区分不同文件,那么就可以不需要为相同的两个文件进行分开缓存直接使用同一个缓存就可以了。
那么就有了下列需要完成的功能
1.缓存器
2.心跳器+排序(快速排序)
3.MD5加密
好了有了目标我们就要开始编码,下面进入实现阶段!
1.实现缓存器
为了实现缓存器就得先构思一下缓存器的结构和成员
成员1:Hash 表 以作为缓存基础 文中采用 System.Collections.Generic.Dictionary<TKey,TValue> 作为缓存基础
成员2: 定时器和后台线程实现心跳功能 文中采用 System.Timers.Timer 和 System.ComponentModel.BackgroundWorker
有了大体设计那么我们来细化设计首先细化成员1 Hash表(以下称基缓存),基缓存中有TKey和TValue两个属性那么我们根据这两个属性来设计一下缓存项的接口
鉴于后续的MD5 在此我们将缓存键设计为System.String 类型做为缓存键,然后细化缓存项目的成员
缓存项接口成员:
属性:缓存键、 大小、心跳时间
方法:刷新缓存 {方法参数: 心跳时间【更新缓存项目最后存活时间】}
事件: 缓存变更通知事件 【通知缓存器进行操作】
实现代码如下:
枚举:CacheChangedType
using System.Collections.Generic;
using System.Text;
namespace Paabo.Files.Common.Caches.Enumns
{
/// <summary>
/// 缓存改变类型
/// </summary>
/// <remarks>Paabo,2012-02-10</remarks>
public enum CacheChangedType
{
/// <summary>
/// 添加
/// </summary>
Added = 0,
/// <summary>
/// 访问
/// </summary>
Access = 1,
/// <summary>
/// 移除
/// </summary>
Removed = 2
}
}