• C# 小文件缓存 适用并发下载


    构思:

         普通的文件下载上传需要反复的进行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

    CacheChangedType

          

         自定义委托和委托参数[通知缓存器进行操作

    CacheEvents

         缓存项 ICacheItem 接口定义 

    ICacheItem

         到此接口定义已经实现,接下来就是实现该接口,接口中包含

    属性: 

           缓存键     System.String

           大小        System.Long

           心跳时间  System.DateTime

    方法:

          更新缓存   参数{心跳时间  System.DateTime}

    事件:

          缓存变更通知  CacheItemChangedEventHandler 

        至此大体上明确,在考虑到以后扩展性方面的问题,我先实现了一个基类 CacheItem 继承于 ICacheItem 简单实现了缓存项接口的属性和方法代码如下

    CacheItem

    CacheItem

      

       到此简单但缓存是够用了但是作为文件缓存还是不够的所以我实现了文件缓存项 ,文件缓存项在缓存项上增加了以下成员

       属性:

             文件名称               System.String

             文件扩展名            System.String 

             文件标题               System.String

             文件内容Byte数组  System.Byte[]

             文件加载类型         枚举

             文件缓存键类型      枚举

       方法: 

            加载文件  参数{文件路径,加载类型,缓存键类型}

            读取文件  参数{偏移量,读取长度} 

            

        好吧我们结构已经设计好了以后就需要根据结构实现代码: 

    先实现文件缓存项中使用到的两个枚举:

     加载类型

    FileLoadType

    缓存键类型

    FileKeyType

    然后实现文件缓存项 FileCacheItem:CacheItem,ICacheItem  

    具体实现代码如下:

    FileCacheItem

    FileCacheItem

    写到这里我们的的缓存器需要使用的缓存项已经实现,接下来就要实现缓存器中需要使用到的 MD5取文件的MD5值 和 缓存项排序算法

    首先我们实现去文件的MD5值辅助类型 命名为MD5Helper 代码如下

      MD5Helper 

    MD5Helper

    接着我们实现排序算法 这里实现的是 快速排序 命名为SortHelper 代码如下

    SortHelper

    SortHelper

     到此缓存器需要的成员基本上准备好了,下面设计一下缓存器的结构

    字段:

      基缓存 

    属性:

      缓存键列表

          缓存值列表 

          缓存有效时间

          缓存检测时间(心跳检测时间)

          缓存器最大容量

          缓存器当前存储大小 

     方法:

      公有

          刷新缓存器设置        参数{缓存器最大容量,缓存有效时间,缓存检测时间}

          检测缓存键是否存在  参数{缓存键}   返回值{是否存在}

          添加缓存                 参数{缓存项}   返回值{缓存键}

          移除缓存                 参数{缓存键}    

          获取缓存                 参数{缓存键}   返回值{缓存项} 

     私有

          开始心跳定时器

          停止心跳定时器

          开始检测异步线程

          触发缓存改变通知     参数{缓存改变类型,缓存改变项} 

     事件:

          缓存改变通知事件

     好吧结构分析完成不废话实现基本没难度就不具体解释直接上代码

    CustomCache 

    CustomCache

    提示使用缓存钱需要先调用    刷新缓存器设置    方法

     到此本次文章基本写完,下一篇准备写文件上传下载!

    各位大牛 老鸟们敬请拍砖,但请勿人身攻击!!!!!!!谢谢!!!!!!! 

                      

                        ↓↓↓↓↓↓猛击此处获取源码↓↓↓↓↓↓

    因公司需要完成一条形码打印问题,所以在找到一些资料做了一个Demo

    特请教!

    不知道此条形码是否正确:

    图:

    源码:

    代码

    本人联系方式为:paabo@live.cn  恭候各位指教。

    http://www.cnblogs.com/duoluodaizi/archive/2009/10/12/1582000.html

  • 相关阅读:
    DP问题之最长非降子序列
    CentOS 6.8 编译安装MySQL5.5.32
    [Linux] killall 、kill 、pkill 命令详解
    编写登陆接口
    python学习day01
    python购物车程序
    ERROR:Attempting to call cordova.exec() before 'deviceready'
    BSF脚本引擎‘改变’Bean
    Solr安装配置
    amchart配置备忘
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2428153.html
Copyright © 2020-2023  润新知