如何防止缓存被自动回收?

时间:2022-10-25 20:54:30
我有个网站里面有些数据需要长时间缓存在内存里。
最好就是除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外,其他情况缓存都能永久存在。
我发现一段时间内没人访问,缓存会被回收掉。可能是IIS的自动回收应用程序池,或者ASP.NET本身的回收?

我试过很多方式,比如静态类里面的静态变量,在Application_End事件里强制自己访问自己。
但是都没办法阻止我的缓存被回收。

请问有什么好的解决办法么。注意,不能修改IIS设置。因为没有这个权限。

21 个解决方案

#1


如何防止缓存被自动回收?

#2


  一般都会回收!

   不会!

  帮你顶!
       

#4


可以使用其他缓存工具,如memcached,将缓存保存在独立的进程里面

#5


既然要長久保存 還是村數據庫裡面最好

#6


永久存在的缓存是不存在的.
缓存本身就是被GC所控制的,即使你设置了永久不过期,系统在资源紧缺的时候,或者闲置过久,仍旧会按照优先级被回收掉.

楼主的设计是有问题的,有什么东西是必须以缓存形式永久存在的?(除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外).

缓存是可以重复写入的,在过期失效之后重新读取就可以了.不必要拘泥于只能读一次就永久存在了.

除非你用非托管代码去申请内存放置你需要的东西,然后仅在Application_End的时候才释放,否则使用托管资源都是需要受GC控制.

#7


都会收回的。

#8


本帖最后由 net_lover 于 2010-10-13 20:14:41 编辑
网站回收会触发
Application_End

你应该采取一个线程自己访问自己,而不是在Application_End事件里访问自己

#9


这个还真的不好说,如果不想回收,永久存在,我觉得这个不现实啊。

#10


放入数据库,放入配置文件。再结合缓存用。

#11


引用 6 楼 lost_painting 的回复:
永久存在的缓存是不存在的.
缓存本身就是被GC所控制的,即使你设置了永久不过期,系统在资源紧缺的时候,或者闲置过久,仍旧会按照优先级被回收掉.

楼主的设计是有问题的,有什么东西是必须以缓存形式永久存在的?(除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外).

缓存是可以重复写入的,在过期失效之后重新读取就可以了.不必要拘泥于只能读一次就永久存在了.

除非你用……


  顶

#12


Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收
定义过期策略来决定缓存中的内容,如已经缓存的时间或者收到其他资源的通知

#13


引用楼主 azure_ceil 的回复:
我有个网站里面有些数据需要长时间缓存在内存里。
最好就是除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外,其他情况缓存都能永久存在。
我发现一段时间内没人访问,缓存会被回收掉。可能是IIS的自动回收应用程序池,或者ASP.NET本身的回收?

我试过很多方式,比如静态类里面的静态变量,在Application_End事件里强制自己访问自己。
但是都没办法阻止我的缓存被……

片面地追求这个有什么意义?
你能将所有的数据都放在内存里?那你还需要数据库吗?
数据库在你眼里是干什么的?
你的数据是永远不变的吗?如果是,那你干脆用静态网页算了。如果不是,你永远保存,数据都变了,你缓存已经过期的数据有什么意义?

#14


保存在数据库

#15


引用 13 楼 zhoufoxcn 的回复:
片面地追求这个有什么意义?
你能将所有的数据都放在内存里?那你还需要数据库吗?
数据库在你眼里是干什么的?
你的数据是永远不变的吗?如果是,那你干脆用静态网页算了。如果不是,你永远保存,数据都变了,你缓存已经过期的数据有什么意义?

up........

#16


没有了 就在查出来,放到缓存里就OK了

至于你说的,一段时间自动回收的话,我个人觉得是很好的,这样就不必要占用资源

#17


该回复于2010-08-18 17:02:28被版主删除

#18


引用 13 楼 zhoufoxcn 的回复:
引用楼主 azure_ceil 的回复:
我有个网站里面有些数据需要长时间缓存在内存里。
最好就是除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外,其他情况缓存都能永久存在。
我发现一段时间内没人访问,缓存会被回收掉。可能是IIS的自动回收应用程序池,或者ASP.NET本身的回收?

我试过很多方式,比如静态类里面的静态变量,在Application_End事件里强制……


up

#19


利用缓存来实现定时任务 http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

#20


学习……

#21


还真没有一直存在

#1


如何防止缓存被自动回收?

#2


  一般都会回收!

   不会!

  帮你顶!
       

#3


#4


可以使用其他缓存工具,如memcached,将缓存保存在独立的进程里面

#5


既然要長久保存 還是村數據庫裡面最好

#6


永久存在的缓存是不存在的.
缓存本身就是被GC所控制的,即使你设置了永久不过期,系统在资源紧缺的时候,或者闲置过久,仍旧会按照优先级被回收掉.

楼主的设计是有问题的,有什么东西是必须以缓存形式永久存在的?(除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外).

缓存是可以重复写入的,在过期失效之后重新读取就可以了.不必要拘泥于只能读一次就永久存在了.

除非你用非托管代码去申请内存放置你需要的东西,然后仅在Application_End的时候才释放,否则使用托管资源都是需要受GC控制.

#7


都会收回的。

#8


本帖最后由 net_lover 于 2010-10-13 20:14:41 编辑
网站回收会触发
Application_End

你应该采取一个线程自己访问自己,而不是在Application_End事件里访问自己

#9


这个还真的不好说,如果不想回收,永久存在,我觉得这个不现实啊。

#10


放入数据库,放入配置文件。再结合缓存用。

#11


引用 6 楼 lost_painting 的回复:
永久存在的缓存是不存在的.
缓存本身就是被GC所控制的,即使你设置了永久不过期,系统在资源紧缺的时候,或者闲置过久,仍旧会按照优先级被回收掉.

楼主的设计是有问题的,有什么东西是必须以缓存形式永久存在的?(除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外).

缓存是可以重复写入的,在过期失效之后重新读取就可以了.不必要拘泥于只能读一次就永久存在了.

除非你用……


  顶

#12


Cache是有时间限制的。超过了服务器设置的过期时间,就会被服务器回收
定义过期策略来决定缓存中的内容,如已经缓存的时间或者收到其他资源的通知

#13


引用楼主 azure_ceil 的回复:
我有个网站里面有些数据需要长时间缓存在内存里。
最好就是除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外,其他情况缓存都能永久存在。
我发现一段时间内没人访问,缓存会被回收掉。可能是IIS的自动回收应用程序池,或者ASP.NET本身的回收?

我试过很多方式,比如静态类里面的静态变量,在Application_End事件里强制自己访问自己。
但是都没办法阻止我的缓存被……

片面地追求这个有什么意义?
你能将所有的数据都放在内存里?那你还需要数据库吗?
数据库在你眼里是干什么的?
你的数据是永远不变的吗?如果是,那你干脆用静态网页算了。如果不是,你永远保存,数据都变了,你缓存已经过期的数据有什么意义?

#14


保存在数据库

#15


引用 13 楼 zhoufoxcn 的回复:
片面地追求这个有什么意义?
你能将所有的数据都放在内存里?那你还需要数据库吗?
数据库在你眼里是干什么的?
你的数据是永远不变的吗?如果是,那你干脆用静态网页算了。如果不是,你永远保存,数据都变了,你缓存已经过期的数据有什么意义?

up........

#16


没有了 就在查出来,放到缓存里就OK了

至于你说的,一段时间自动回收的话,我个人觉得是很好的,这样就不必要占用资源

#17


该回复于2010-08-18 17:02:28被版主删除

#18


引用 13 楼 zhoufoxcn 的回复:
引用楼主 azure_ceil 的回复:
我有个网站里面有些数据需要长时间缓存在内存里。
最好就是除非网站的DLL文件或者WEB.CONFIG被修改强制了网站重启以外,其他情况缓存都能永久存在。
我发现一段时间内没人访问,缓存会被回收掉。可能是IIS的自动回收应用程序池,或者ASP.NET本身的回收?

我试过很多方式,比如静态类里面的静态变量,在Application_End事件里强制……


up

#19


利用缓存来实现定时任务 http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

#20


学习……

#21


还真没有一直存在