为了程序的灵活性,可能为程序使用了XML等外部文件存储配置,但也有可能文件内容会被频繁读取,为了减少磁盘的读取次数,提高程序性能,可以将频繁读取的配置文件缓存到内存中,加速配置的读取。并且需要可以在配置文件更改后及时的更新缓存。

(该功能可能是.NET Framework 4.0 新加,其他低版本未测试)

下面通过一个方法来说明缓存的使用方法,说明详见注释:

/// <summary>
/// 从内存缓存中读取配置。若缓存中不存在,则重新从文件中读取配置,存入缓存
/// </summary>
/// <param name="cacheKey">缓存Key</param>
/// <returns>配置词典</returns>
private static Dictionary<string, string> GetConfigDictionary(string cacheKey)
{Dictionary<string, string> configs = null;//1、获取内存缓存对象ObjectCache cache = MemoryCache.Default;//2、通过Key判断缓存中是否已有词典内容(Key在存入缓存时设置)if (cache.Contains(cacheKey)){//3、直接从缓存中读取词典内容configs = cache.GetCacheItem(cacheKey).Value as Dictionary<string, string>;}else{//3、读取配置文件,组成词典对象,准备放到缓存中configs = GetFromXml();//4、检查是否读取到配置内容if (configs != null){//4、新建一个CacheItemPolicy对象,该对象用于声明配置对象在缓存中的处理策略CacheItemPolicy policy = new CacheItemPolicy();//5、因为配置文件一直需要读取,所以在此设置缓存优先级为不应删除// 实际情况请酌情考虑,同时可以设置AbsoluteExpiration属性指定过期时间policy.Priority = CacheItemPriority.NotRemovable;//6、将词典内容添加到缓存,传入 缓存Key、配置对象、对象策略// Set方法首先会检查Key是否在缓存中存在,如果存在,更新value,不存在则创建新的// 这里先加入缓存再加监视的原因是:在缓存加入时,也会触发监视事件,会导致出错。
            cache.Set(cacheKey, configs, policy);//7、监视文件需要传入一个IList对象,所以即便只有一个文件也需要新建List对象List<string> filePaths = new List<string>() { "c:\config.xml" };//8、新建一个文件监视器对象,添加对资源文件的监视HostFileChangeMonitor monitor = new HostFileChangeMonitor(filePaths);//9、调用监视器的NotifyOnChanged方法传入发生改变时的回调方法monitor.NotifyOnChanged(new OnChangedCallback((o) =>{ cache.Remove(cacheKey);}));//10、为配置对象的缓存策略加入监视器
            policy.ChangeMonitors.Add(monitor);}}return configs;
}

反正缓存用起来也就是通过Key来增删改查,内存缓存还可以在config中的配置对内存的使用情况,其实默认自动管理也不错哈。

相关内容可以查阅msdn:http://msdn.microsoft.com/ZH-CN/library/vstudio/dd941872(v=vs.110).aspx

转载于:https://www.cnblogs.com/xwgli/p/3306149.html

为程序使用内存缓存(MemoryCache)相关推荐

  1. 内存缓存MemoryCache

    内存缓存MemoryCache实现了ICache接口,Redis同样实现了ICache接口,两者在缓存操作上达到了高度抽象统一.应用设计时一律使用ICache接口,开发环境装配为MemoryCache ...

  2. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  3. 关于 ASP.NET 内存缓存你需要知道的 10 点

    缓存机制的主要目的是提高应用程序的性能.作为 ASP.NET 开发人员,你可能会意识到 ASP.NET Web 窗体以及 ASP.NET MVC 可以使用 Cache 对象缓存应用程序的数据.这通常被 ...

  4. Android UIL图片加载缓存源码分析-内存缓存

    本篇文章我们来分析一下著名图片加载库Android-Universal-Image-Loader的图片缓存源码. 源码环境 版本:V1.9.5 GitHub链接地址:https://github.co ...

  5. 微信小程序开发-视频多大小程序就会缓存多大,导致小程序内存不足自动闪退的问题解决方法

    微信小程序开发- 一开始添加的视频是mp4 格式的,视频多大微信小程序就会缓存多大, 但是我如果直接在微信聊天打开视频链接就不会,缓存就很少. 比如我有个视频1G, 把它放到腾讯云对象存储,把视频链接 ...

  6. ASP.NET Core中的内存缓存

    ASP.NET Core中的内存中缓存 让我们看看如何通过缓存优化ASP.NET Core应用程序性能 我相信,在我们的工作中,每个人都收到来自客户的请求或来自我们应用程序用户的反馈,以提高响应速度. ...

  7. YYCache 源码解析(一):使用方法,架构与内存缓存的设计

    YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识. ...

  8. 程序在内存中运行的奥秘

    简介 当丰富多彩的应用程序在计算机上运行,为你每天的工作和生活带来便利时,你是否知道它们是如何在计算机中工作呢?本文用形象的图表与生动的解释,揭示了程序在计算机中运行的奥秘. 内存管理是操作系统的核心 ...

  9. 如何优化cocos2d程序的内存使用和程序大小:第一部分

    译者: 在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区 ...

  10. Linux下的十个好用的命令工具:查看系统版本,显示目录的大小,查看硬盘HDD/SSD,硬盘测速,ssh时自动输入密码,查看程序的内存使用情况,查看I/O的速度,查看ssh密码错误日志,查找文件

    文章目录 1.查看系统版本 2.显示目录的大小 3.查看硬盘是HDD还是SSD 4.硬盘测速 5.在ssh的时候自动输入密码 6.查看程序的内存使用情况 7.查看I/O的速度 8.查看ssh密码错误日 ...

最新文章

  1. ubuntu分屏软件_Ubuntu 17.10安装终端分屏:Terminator终端终结者
  2. [摘抄]江湖经验:喝酒时玩的游戏大全!
  3. 聊聊LightProbe原理实现以及对LightProbe数据的修改
  4. 杜教筛--51nod1239 欧拉函数之和
  5. (pytorch-深度学习系列)模型参数的初始化与访问操作-学习笔记
  6. java 全排序_Java排序算法全
  7. ue4 网络代码分析
  8. SQL 2016 性能调优培训来了!!! 还免费!!!
  9. TensorFlow神经网络(八)卷积神经网络之Lenet-5
  10. 苹果回忆:为证明 iPhone 结实,乔布斯拿起手机就往地上摔
  11. vs 设置护眼背景颜色
  12. 深度学习核心词汇-英文
  13. 自组织(竞争型)神经网络
  14. android录音波浪动画_Android实现炫酷的波浪下载Loading动画
  15. ie浏览器读取本地文件并上传
  16. 回溯法—子集树与排列树
  17. 保证你会爱上的软件--私藏
  18. php游戏简单模块,PHP编写的25个游戏脚本
  19. 字符串查找函数 php,php字符串查找函数(strrpos与strchr)
  20. linux 32位中文版,Linux_Deepin_2014下载|Linux Deepin 2014.3 官方简体中文最新版(32位/64位) - 飞极下载站...

热门文章

  1. python主线程执行回调函数_Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程...
  2. zabbix监控之概念和安装
  3. 7月新的开始 - Axure学习05 - 元件库的创建
  4. 自动触发click事件
  5. MVC中单选按钮的实现
  6. Bootstrap如何禁止响应式布局 不适配
  7. PHP面相对象中的重载与重写
  8. Oracle Temp表空间切换
  9. servlet 单例问题
  10. 如何优雅的关闭Golang Channel?