charleschen的麦地

——SomeDay I Will Be Back!

导航

缓存!缓存!缓存!!!(一)

Posted on 2007-02-27 13:38  charleschen  阅读(1050)  评论(0编辑  收藏  举报

前言

        相信大多数开发人员都比较了解缓存了,很多开发人员都在软件开发中使用了预定义或自定义的缓存,并从中获得了预期的应用程序的性能提升.这篇和后续文章将详细的介绍与探讨.net体系下的缓存实现的机制,并讨论它的优点与缺点.

 使用缓存的实际价值:
       kevinhoffmanlonnykruger的书中写到:开发人员经常需要将数据(临时数据)临时存放到一个存储媒体以便快速访问.这种临时数据的存储器叫做缓存.如果开发人员合理使用缓存,则可以大幅度提高应用程序的性能.

        上面是一段完美的关于缓存的定义,就目前而言,迅速而便捷的将数据提供给核心处理代码已成为一个重要的设计要求。,迅速是为了增强用户体验,便捷可以降低系统压力。而缓存则可以完成任务,虽然不是那么完美。

 形形色色的缓存机制几乎都有以下一些主要共同点:
       1.提供数据临时存储,缓存数据是否存在具有不确定性。
       2.可以设定缓存优先级。
       3.可以制定缓存依赖,依赖过期则缓存数据不可用。 
       4.缓存的核心是MAP

 关于缓存的一些讨论:

临时缓存VS持久缓存:
       其实从理论上说微软.net的缓存解决方案是最完美的缓存的实现,但是正因为其教科书式的实现使得不少程序员们抱怨个不停。一个可能存在的悖论是:千辛万苦获得的数据被塞进缓存,因为系统内存紧张而被放弃,虽然它是为了缓解压力而来。这并不是微软的问题,而是程序员们贪得无厌的胃口和不当的使用方式所致。
      在很多的开源缓存机制中都采用的持久缓存的方法来实现,其实这些与其说是缓存,我觉得更像是一个增强的session,将缓存的优先级,缓存依赖机制安装在其上。开发起来既简单又轻松(.net cache 牵涉了大量底层非托管代码)。

内容缓存VS数据缓存:
  内容缓存不是唯一的选择,数据缓存也不是没有优点。虽然性能上稍有不足,但是把数据存放在数据库中却省去了清理缓存的麻烦,。另一个显而易见的优点是易于负载分配,尤其是我们拥有一个怪兽数据库服务器时。从实现技术上来说,麻烦的多线程问题也可以方便的转嫁。在选择实现内容缓存还是数据缓存,有很多不得不考虑的因素,花落谁家就看所开发的程序所特殊要求了.

值得重视的依赖:
          .net framework给我们提供了常用的几个缓存依赖:时间,文件,数据库。但是由于微软一贯的作分,我们无法创建新类型的依赖(SqlCacheDependency功能何其何其之弱…)。企业库自定义依赖是个好主意,我们只需要继承ICacheItemExpiration接口即可!虽然我依然被依赖的生存周期和清理折腾的焦头烂额。