【发布时间】: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;
这会花费我两倍的内存还是只是为了另一个索引参考?
【问题讨论】: