2011-09-17 31 views
2

我们有一个ASP.NET 4.0应用程序,它从数据库中绘制一个复杂的数据结构,该结构需要12个小时才能进入内存数据结构(稍后存储在HttpRuntime.Cache中)。数据结构的大小正在迅速增加,如果应用程序重新启动,我们无法继续等待12个小时以将其存入内存。如果您想更改web.config或导致重新启动的Web应用程序中的任何代码,这是一个主要问题 - 这意味着应用程序可以使用前的漫长等待时间,并阻碍开发或更新部署。50GB HttpRuntime.Cache持久可能吗?

数据结构务必在内存中以使网站可用的速度工作。在内存数据库中,如memcache或Redis与HttpRuntime.Cache相比速度较慢,并且在我们的情况下不起作用(内存中的db必须序列化put/get,而且它们不能相互引用,所以它们使用的键是查找 - 性能下降,加上大量密钥,性能快速下降)。表演是必须的。

我们希望做的是快速转储程序结束前的HttpRuntime.Cache到磁盘(在重新启动),并能够立即加载它回来时,应用程序再次(希望开始几分钟内,而不是12+几小时或几天)。

内存中的结构大约为50GB。

有没有解决方案?

+0

只要你的机器有足够的内存(在你的情况下64GB +)和体面的磁盘阵列应该没问题...不知道你还在寻找什么样的重新设计,看起来不像是一个基于问题的选项。 –

+0

你所要求的有点违背逻辑。为什么你想要与整个50GB数据结构交互?对于这个更好的数据库结构或适当的报告方法来说,这是理想的解决方案吗? – slugster

+0

@Stephen解决方案是让您赢得简单的自定义缓存并使用它。最容易的是创建一个平坦的新表,并且包含所有复杂的数据结构,并在必要时更新它,我认为你走错了路。 – Aristos

回答

8

内存数据库等内存缓存或Redis的是比较缓慢的HttpRuntime.Cache

是的,但他们都非常快相比12+小时的自旋向上。就我个人而言,我认为您在强制加载50 GB结构时采取了错误的方法。只是一个建议,但我们使用HttpRuntime.Cache作为多层缓存策略的一部分:

  • 本地缓存检查等第一
  • 否则的Redis用作缓存的下一层(这是比快的基础数据,持久性,且支持多个应用服务器的)(然后本地高速缓存被更新)
  • 否则,底层数据库被击中(然后两者redis的和本地高速缓存被更新)

点在加载时,我们不需要需要记忆中的任何东西 - 它在需要时被充满,从那时开始很快。我们还使用pub/sub(redis的礼貌)来确保提示缓存失效。最终的结果是:它足够快,寒冷时,温暖时速度非常快。

基本上,我会看什么,避免需要的50GB数据之前,你可以做任何事情


如果这个数据是不是真的缓存,但你数据,我想看看序列化在一个适当的对象模型。我会建议protobuf-net(我偏袒作者)作为这里的强大候选人 - 非常快速和非常小的输出。

相关问题