求解HttpRuntime.Cache偶尔缓存丢失的问题

本文探讨了ASP.NET中使用HttpRuntime.Cache时出现的缓存丢失现象,分析了可能的原因,包括内存不足、IIS重启及应用程序重启等情况,并讨论了不同缓存策略的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当用户登入的时候,我把该用户的权限放到缓存中(用的是HttpRuntime.Cache),用户的每次操作都会验证权限。现在的问题是,在验证权限的方法中,我会先判断一下是否存在了权限cache,如果不存在,则处理之;存在,则继续判断是否有执行操作的权限。Cache cache = HttpRuntime.Cache;
 List<string> rule = bllAction.GetRoleActionNameList(roleIds);
 cache.Insert("CACHE_PERMISSION_RULE"+ user.PublisherId.ToString(), rule, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 60, 0), System.Web.Caching.CacheItemPriority.NotRemovable, null);
请问,为什么系统发布之后,偶尔会出现缓存丢失?
ASP.NET  12 次浏览  2011-02-16 15:35
12 个回答
在线等啊 各位大虾
2011-02-16 15:36  推荐: 0 次 
每次去缓存里面东西的时候都需要去判断有没有,因为有可能已经不在了。
丢失的原因会有很多,可能是内存不够,可能是IIS重启等。
2011-02-16 15:44  推荐: 0 次 
To   
gws044010607:
现在就是不知道什么原因导致缓存丢失。。。。。。。正常情况下,我是在退出系统的时候清空缓存的。按这个设置,是1小时没操作才会丢失,但他们说是连续在操作的,所以不可能。至于内存的问题,应该不存在。IIS重启,这个可能性也不大,因为我们这个系统已经上线给很多客户在用,不大会重启的。
2011-02-16 15:58  推荐: 0 次 
会不会有这样一种可能:通一个账号被2个人登入,然后由于一个人退出了,导致这个账号的缓存丢失,然后另外一个人在操作的时候 就会出”缓存丢失“的问题?
2011-02-16 16:00  推荐: 0 次 
C# code
      
cache.Insert( " CACHE_PERMISSION_RULE " + user.PublisherId.ToString(), rule, null , [color = #FF0000]Cache.NoAbsoluteExpiration, new TimeSpan( 0 , 60 , 0 ), [ / color]System.Web.Caching.CacheItemPriority.NotRemovable, null ); cache.Insert( " CACHE_PERMISSION_RULE " + user.PublisherId.ToString(), rule, null , [color = #FF0000]这里指定一个绝对时间试试[ / color], System.Web.Caching.CacheItemPriority.NotRemovable, null );
2011-02-16 16:08  推荐: 0 次 
cache.Insert("CACHE_PERMISSION_RULE"+ user.PublisherId.ToString(), rule, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 60, 0), System.Web.Caching.CacheItemPriority.NotRemovable, null);

cache.Insert("CACHE_PERMISSION_RULE"+ user.PublisherId.ToString(), rule, null,  这里指定一个绝对时间试试, System.Web.Caching.CacheItemPriority.NotRemovable, null);

2011-02-16 16:08  推荐: 0 次 
在Cache中的内容会在应用程序重启后被进程回收的。
导致应用程序重启的情况很多,比如内存占用高,bin目录的dll变动,web.config文件修改等。
HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象。  
HttpRuntime.Cache:获取当前应用程序的Cache。  
另外不同登录帐号存入Cache中的键值一定要不同.Cache中只会保存不同的键值..相同的就会冲掉
2011-02-16 16:10  推荐: 0 次 
可以试试楼上的方法,但内存不够用时就有问题。
2011-02-16 16:10  推荐: 0 次 

少了个参数,额。。
补上
DateTime outDt = Convert.ToDateTime("2011-02-15 16:12:34:456");
cache.Insert("CACHE_PERMISSION_RULE"+ user.PublisherId.ToString(), rule, null,  outDt,System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
2011-02-16 16:11  推荐: 0 次 
To Rock870210
你是说的把Cache.NoAbsoluteExpiration这个换成绝对时间?
2011-02-16 16:22  推荐: 0 次 
引用 7 楼 wuyq11 的回复:
在Cache中的内容会在应用程序重启后被进程回收的。
导致应用程序重启的情况很多,比如内存占用高,bin目录的dll变动,web.config文件修改等。
HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象。 
HttpRuntime.Cache:获取当前应用程序的Cache。 
另外不同登录帐号存入Cache中的键值一定要不同.Cache中只会保……

我们这个系统是上线了的,没人会去重启的,所以大虾你说的这种情况应该不会发生的。。。。。。。。
2011-02-16 16:38  推荐: 0 次 
引用 10 楼 hxbdzwy 的回复:
To Rock870210
你是说的把Cache.NoAbsoluteExpiration这个换成绝对时间?

可以试试。你可以再去查查这个Insert方法,不同参数产生的不同效果
好像MSDN上有
2011-02-16 16:51  推荐: 0 次 

http://s.yanghao.org/program/viewdetail.php?i=34444


问:
小弟在使用Cache存放对象。但是发现Cache有丢失的现象。不知道如何解决?
______________________________________________________________________________________________
答1:
对象是属于引用类型的数据
使用Application,Session,Cache保存对象 实际上只是保存对象的引用,也就是指向对象存放数据的指针。
______________________________________________________________________________________________
答2:
如果你要建一个全局性的对象
在Global.asax里面建立,这样,这个对象就可以在任何一张页面使用。
______________________________________________________________________________________________
答3:
如何设置Cache的生命周期呢?
______________________________________________________________________________________________
答4:
对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来提供。


这是msdn上的解释 要是Cache的对象一直存在 可以在Global.asax里面建立 Global.asax运行在整个目录中及其所含的子目录每一一个页面程序的父应用程序域。
只要IIS服务不停下来,Global.asax中Cache的东西就一直在。
各个页面Cache的东西只是在这个页面执行UnPage_Load后(可以这么认为,准确的是被垃圾回收后或这个页面对象被拆构后)就被摧毁。


http://study.qqcf.com/web/716/226208.htm


  本博客程序使用过程中,查看错误日志,发现以下错误:

< ErrorItem >  
  
< Date > 2007-12-13 18:07:26    出错文件:http://xianfen.net/Default.aspx </ Date >  
  
< Message > 错误信息:引发类型为“System.Web.HttpUnhandledException”的异常。    内部错误信息:未将对象引用设置到对象的实例。 </ Message >  
</ ErrorItem >  
< ErrorItem >  
  
< Date > 2007-12-13 18:07:27    出错文件:http://xianfen.net/Default.aspx </ Date >  
  
< Message > 错误信息:引发类型为“System.Web.HttpUnhandledException”的异常。    内部错误信息:未将对象引用设置到对象的实例。 </ Message >  
</ ErrorItem >  
< ErrorItem >  
  
< Date > 2007-12-13 21:01:47    出错文件:http://www.xianfen.net/Category5_1.aspx?ClassID=5 &amp; page=1 </ Date >  
  
< Message > 错误信息:引发类型为“System.Web.HttpUnhandledException”的异常。    内部错误信息:未将对象引用设置到对象的实例。 </ Message >  
</ ErrorItem >  
< ErrorItem >  
  
< Date > 2007-12-14 9:21:02    出错文件:http://www.xianfen.net/Archive200712.aspx?Year=2007 &amp; Month=12 </ Date >  
  
< Message > 错误信息:引发类型为“System.Web.HttpUnhandledException”的异常。    内部错误信息:未将对象引用设置到对象的实例。 </ Message >  
</ ErrorItem >  
...

很多“未将对象引用设置到对象的实例。”,仔细审查每一行程序,没发现使用空对象的情况。无奈之时,在本机上随便调试,发现异常代码段之一为:
public   static   string  BlogTitle 

    
get  
    { 
        
if  (HttpContext.Current.Cache[ " BlogTitle " ==   null
        { 
            HttpContext.Current.Cache[
" BlogTitle " =  ConfigurationManager.AppSettings[ " BlogTitle " ]; 
        } 

        
return  HttpContext.Current.Cache[ " BlogTitle " ].ToString();   // 在此抛出异常"未将对象引用设置到对象实例"  
    } 


为了提高性能,本博客系统多处使用缓存,但每次取缓存数据时都检查是否为空啊?只好 Google,发现有和我遇到一样问题的,原来缓存 Cache 在内存不足时会移除,看来虚拟空间的内存紧张到极点了,刚设置的缓存就被移除了!
将Cache用Application代替:
public   static   string  BlogTitle 

    
get  
    { 
        
if  (HttpContext.Current.Application[ " BlogTitle " ==   null
        { 
            HttpContext.Current.Application[
" BlogTitle " =  ConfigurationManager.AppSettings[ " BlogTitle " ]; 
        } 

        
return  HttpContext.Current.Application[ " BlogTitle " ].ToString(); 
    } 


问题解决!
google_ad_client = "pub-6296215529938421"; google_ad_slot = "7551901419"; google_ad_width = 728; google_ad_height = 90;


http://www.haogongju.net/art/885891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值