ASP.. NET缓存策略

本文关键字:策略 缓存 NET ASP | 更新日期: 2023-09-27 18:07:45

我正在为常用的数据库对象实现数据缓存,我在决定缓存以下场景的最佳策略时遇到了一些困难:

我有一个名为Campaigns的表,包含1423条记录。Campaign包含了描述登陆页面的所有文本和设置。当生成一个登陆页面时,从数据库中获取相应的Campaign。一些登陆页面的浏览量高于其他页面。

(输出缓存是我的下一步,所以不需要注释。)

我在大声思考:

A)在服务器启动时将所有战役加载到Dictionary中,并将其放入缓存中。

我已经计算过,这将花费大约3.8 MB的服务器内存(OK),并将花费大约8秒(OK)的第一页浏览量与当前的活动。唯一的问题是,这不能很好地扩展。明天我可能会有10倍的活动。此外,我们需要每天更新和添加新的战役,而每次删除整个战役缓存似乎有点过度。

这样做的好处是,所有的广告系列总是被缓存,所以没有启动时间,当一个尚未访问的登陆页面被访问(例如,一个搜索引擎)。

B)延迟加载:每个战役单独缓存一个键,如"战役。[id]"

这将使消灭或添加单个活动变得非常容易,并且我可以对较少使用的活动使用SlidingExpiration等缓存功能。唯一的问题是,当搜索引擎访问一个很少访问的页面时,广告活动就加载了。另一个问题是缓存中有大量的键。

C)与B)和缓存相同的好处是惰性加载到字典中,并且缓存不会被键负载混乱,但不能使用缓存功能,如果内存紧张,整个字典被转储。

你觉得怎么样?我倾向于B)。

另外,我有这样的场景,我需要通过id或代码(字符串)获得活动。

Campaigns campaign = //Get campaign from database:
Cache["Campaigns.Id."+campaign.Id.ToString()] = campaign; //Id is Guid
Cache["Campaigns.Code."+campaigns.Code] = campaign;

这将花费我两倍的内存还是仅仅为另一个索引引用?

ASP.. NET缓存策略

嗯,我想看看缓存分组项(类似于你的B想法),但对它们设置一个暂停。这意味着很少使用的项将被缓存,但最终会刷新。超时时间应与正常使用频率相关。例如,如果一个普通的活动每小时被点击10次,那就把暂停时间设置得很低,比如5-10分钟。

ASP。. NET缓存内置了这个超时的东西:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/caching/data.aspx

内存很便宜,但仍然需要维护。作为第一次执行,我认为一个基本的超时设置是一个不错的开始。这将需要监控,就像任何缓存实现一样,看看它是帮助还是阻碍了您的使用模式。

我不会像每个单独的项目那样细粒度地惰性加载。用法应该显示常见的项目,或者您可以选择批次(前10名,前20名等)。智能地选择经常访问的项和通常不经常访问的项的组将有助于改善缓存的健康状况(没有很多过时的项,没有太多的流失,等等)。

至于总体内存使用情况,我认为ASP。. NET缓存可以配置为限制获取的字节数:

http://msdn.microsoft.com/en-us/library/ms228248.aspx

所以你不需要担心太多