none
ASP.NET 缓存被强制移除的问题 RRS feed

  • 问题

  • 我的在我的站点上使用了对象缓存,将站点信息、新闻信息统统存入缓存,缓存的优先级设置为NotRemovable,在低并发的状态下没有问题,在搞并发的状态下(网站连接数大于1000)之后缓存5分钟左右被移除一次,我在移除回调方法中进行了日志写入。

    以下是缓存日志:

    2013-10-16 19:19:48.545 缓存失效 原因:Removed--缓存:Sites 2013-10-16 19:19:48.576 缓存失效 原因:Removed--缓存:News 2013-10-16 19:22:41.795 缓存失效 原因:Removed--缓存:Sites 2013-10-16 19:22:41.951 缓存失效 原因:Removed--缓存:News 2013-10-16 19:26:58.239 缓存失效 原因:Removed--缓存:Sites 2013-10-16 19:26:58.364 缓存失效 原因:Removed--缓存:News 2013-10-16 19:31:26.623 缓存失效 原因:Removed--缓存:Sites 2013-10-16 19:31:26.717 缓存失效 原因:Removed--缓存:News

    建立缓存的代码:

    public List<news> GetNewsCache()
     {

    List<news> newsList = new List<ZtoWeb.Model.news>(); if (HttpContext.Current.Cache["News"] == null) { string commandText; commandText = "select CONTENT,CLASSID,FROMDEP,INPUTTIME,HITS,TITLE,USER_NAME,ID,USER_IP,TITLE_COLOR,SIGN,SUPPLYMAN from TAB_ZTWEB_NEWS"; IDbHelper dbHelper = new OracleHelper(BaseSystemInfo.BusinessDbConnection); using (IDataReader dataReader = dbHelper.ExecuteReader(commandText.ToString())) { while (dataReader.Read()) { //赋值语句 newsList.Add(newsModel); } dataReader.Close(); } CacheItemRemovedCallback onRemove = new System.Web.Caching.CacheItemRemovedCallback(this.CacheItemRemovedCallback); HttpContext.Current.Cache.Add("News", newsList, null, Cache.NoAbsoluteExpiration, TimeSpan.FromDays(1), CacheItemPriority.NotRemovable, onRemove); } return HttpContext.Current.Cache["News"] as List<news>; }

    服务器:windows2003

    IIS:6.0

    .NET:4.0

    程序池分配内存:3000MB

    程序运行后使用内存:500MB--900MB之间

    不知道各位有没有谁遇过这种情况~或者各位有什么看法,能否给小弟一些指导


    • 已编辑 ULiiAn 2013年10月16日 11:44 漏代码
    2013年10月16日 11:37

答案

  • 我自己回答吧,今天终于解决了!今天问了韦恩卑鄙大大,他告诉我看看是不是被IIS回收了~经过检查发现程序池里勾选了一个项目

    好吧,我们的网站最高的时候一台服务器1W+的连接数,低峰的时候1K+的连接数~所以很悲催的~一会儿就被回收。所以就常常被回收缓存白做了,反而性能问题更严重!今天把这个钩去掉世界平静了,网站快速了~

    • 已标记为答案 ULiiAn 2013年10月17日 14:58
    2013年10月17日 14:58

全部回复

  • 你好:

    欢迎来到MSDN论坛!

    ASP.NET 缓存概述

    出于以下原因之一,ASP.NET 可以从缓存中移除数据:
    •由于服务器上的内存不足,开始一个称为“清理”的过程。
    
    •由于缓存中的项已过期。
    
    •由于项的依赖项发生了更改。
    
    

    CacheItemPriority 枚举

    NotRemovable
    在服务器释放系统内存时,具有该优先级级别的缓存项将不会被自动从缓存删除。 但是,具有该优先级级别的项会根据项的绝对到期时间或可调整到期时间与其他项一起被移除。 
    无论项的缓存优先级如何,总能以编程方式从缓存中移除项。

    根据MSDN文档的解释,即使设置了NotRemovable,也不能保证数据是完全受信任的。NotRemovable只是相对来说优先级比较高而已。

    我的建议是在发现缓存被移除的时候重新加载被移除的项

    如何:从缓存中移除项时通知应用程序

    或者你也可以设置一个全局的集合类来保存你的数据(比如Dictionary<key,value>),以确保数据在AppDomain被卸载之前一直保存在内存中。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年10月17日 8:41
    版主
  • 我自己回答吧,今天终于解决了!今天问了韦恩卑鄙大大,他告诉我看看是不是被IIS回收了~经过检查发现程序池里勾选了一个项目

    好吧,我们的网站最高的时候一台服务器1W+的连接数,低峰的时候1K+的连接数~所以很悲催的~一会儿就被回收。所以就常常被回收缓存白做了,反而性能问题更严重!今天把这个钩去掉世界平静了,网站快速了~

    • 已标记为答案 ULiiAn 2013年10月17日 14:58
    2013年10月17日 14:58