【问题标题】:ASP.NET caching strategyASP.NET 缓存策略
【发布时间】:2011-11-12 00:43:43
【问题描述】:

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

我有一个名为 Campaigns 的表,其中包含 1423 条记录。广告系列包含描述登录页面的所有文本和设置。生成登录页面时,将从数据库中获取相应的营销活动。一些登陆页面的浏览量比其他页面多。

(输出缓存是我的下一步,因此无需对此发表评论。)

我在大声思考:

A) 在服务器启动时将所有活动预先加载到字典中并将其放入缓存中。

我计算出这将占用大约 3.8 MB 的服务器内存 (OK),并且在当前的广告系列数量下,第一页浏览大约需要 8 秒 (OK)。唯一的问题是这不能很好地扩展。明天我可能会有 10 倍的活动量。此外,我们需要每天更新和添加新的广告系列,每次都删除整个广告系列缓存似乎有点矫枉过正。

这样做的好处是所有广告系列都始终被缓存,因此在访问尚未访问的登录页面(例如通过搜索引擎)时没有启动时间。

B) 延迟加载:使用“Campaigns.[id]”之类的键单独缓存每个广告系列

这将使杀死或添加单个广告系列变得非常容易,并且我可以将 SlidingExpiration 等缓存功能用于较少使用的广告系列。唯一的问题是,当搜索引擎访问一个很少访问的页面时,就是加载广告系列的时候。另一个问题是缓存中充斥着大量的键。

C) 将与 B) 相同的 bennefins 延迟加载到字典中,并且缓存不会被大量的键弄乱,但不能使用缓存功能,如果内存紧张,整个字典都会被转储。

你怎么看?我倾向于 B)。

另外,我需要通过 id 或代码(字符串)获取活动。

如下:

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

这会花费我两倍的内存还是只是为了另一个索引参考?

【问题讨论】:

    标签: c# asp.net caching


    【解决方案1】:

    嗯,我想看看缓存分组项目(类似于你的 B 想法),但对它们设置一个超时。这意味着很少使用的项目将缓存,但最终会刷新。超时应该与正常使用的频率相关。例如,如果一个正常的广告系列每小时被击中 10 次,则将超时设置得很低,可能是 5-10 分钟。

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

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

    内存很便宜,但仍需要维护。作为第一次实现,我认为基本的超时设置不是一个糟糕的开始。这需要像任何缓存实现一样进行监控,以查看它是否有助于或阻碍您的使用模式。

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

    至于整体内存使用,我认为可以配置 ASP.NET Cache 来限制占用的字节数:

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

    所以你不必担心太多。

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2010-12-12
      • 1970-01-01
      • 2012-09-05
      相关资源
      最近更新 更多