Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET缓存策略_C#_Asp.net_Caching - Fatal编程技术网

C# ASP.NET缓存策略

C# ASP.NET缓存策略,c#,asp.net,caching,C#,Asp.net,Caching,我正在为常用的数据库对象实现数据缓存,在决定缓存以下场景的最佳策略时遇到了一些困难: 我有一张名为“活动”的表格,有1423条记录。活动包含描述登陆页面的所有文本和设置。生成登录页时,将从数据库中获取相应的活动。一些登录页面的浏览量比其他页面多 (输出缓存是我的下一步,因此无需对此发表评论。) 我大声地想: A) 服务器启动时,将所有活动预先加载到字典中,并将其放入缓存 我已经计算过,这将需要大约3.8MB的服务器内存(OK),在当前活动量的情况下,第一次查看页面大约需要8秒(OK)。唯一的问题

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

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

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

我大声地想:

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

我已经计算过,这将需要大约3.8MB的服务器内存(OK),在当前活动量的情况下,第一次查看页面大约需要8秒(OK)。唯一的问题是,这不能很好地扩展。明天我可能会有10倍数量的活动。此外,我们还需要每天更新和添加新的活动,每次删除整个活动缓存似乎有点过火

这其中很好的一点是,所有的活动都会被缓存,这样在访问未访问的登录页面时(例如通过搜索引擎)就不会有启动时间

B) Lazyloading:使用类似“活动。[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;

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

Hmmm,在我的脑海中,我会查看缓存分组项目(类似于您的B想法),但会对它们设置一个超时。这意味着很少使用的项目将缓存,但最终会刷新。超时时间应与正常使用频率相关。例如,如果一个正常的活动每小时被击中10次,那么将暂停时间设置得很低,可能是5-10分钟

ASP.NET缓存内置了此超时功能:

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

我不会像每一个项目那样懒散地加载。用法应该显示常见项目,或者您可以选择批次(前10、前20等)。智能地选择经常访问的项目组和经常不经常访问的项目组将有助于改善缓存的运行状况(没有太多过时的项目,没有太多的搅动,等等)

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

所以你不必太担心这些