ASP.NET 数据缓存 - 在应用程序域重启后保留内容

4
我正在使用ASP.NET的数据缓存API。例如:
HttpRuntime.Cache.Insert(my_data, my_key);

有没有办法配置缓存,使得当应用程序域重启时缓存内容得以保留?

我将许多对象加载到缓存中,但每次应用程序域重新启动时,重新加载这些对象会有相当大的延迟。假设对于这个问题,由于服务器配置,我不能阻止应用程序域的重启。

3个回答

2
有没有办法配置缓存,使其在应用程序域回收时保留其内容?
不行。缓存对象在RAM中保存引用。只能如此。
替代方案:
1. 进程外会话状态(尽管这是每个用户的) 2. 分布式缓存 3. 使用SQL Server作为缓存(它将数据保存在内存中而不是磁盘上) 4. 将对象写入Web层的磁盘
我个人更喜欢第三种方法,但也有适用于其他方案的场景。

缓存API不能配置为持久化到SQL Server,对吗?我需要修改当前的缓存API调用以通过另一个API进行。 - frankadelic
正确。Cache API仅适用于内存引用;没有任何选项使条目持久。原因是持久性需要以某种形式进行序列化,这是昂贵的。事实上,Cache API的常见用途之一是专门避免序列化和相关开销。但是,如果您的数据源自SQL Server,则不需要再次将其持久化;您只需要在更改时收到通知,这就是SqlDependency的全部内容。 - RickNZ

0

回收应用程序域会清空缓存。如果您想避免这种情况,您需要使用分布式缓存。这里有一个例子。


0

对于最昂贵的数据,您可以使用分布式缓存(例如Memcached或velocity)缓存对象。根据对象的大小和运行时间的长度,您还可以将其序列化到磁盘或数据库中,前提是访问这些资源的速度小于创建对象的时间。

现在,由于进程内缓存与任何其他解决方案相比非常快,因为它只持有对内存对象的引用,所以您应该尽可能使用它。您可以在磁盘上保留缓存对象的副本,直到丢失,然后从中重新创建并放置在内存中。当您必须过期数据时,这会变得棘手,因此只在不需要过期/使数据无效的情况下使用缓存/磁盘/SQL组合,否则您将需要确保清除两者。这也可以解决在共享服务器上无法实现分布式缓存的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接