缓存大数据

时间:2013-06-05 06:40:49

标签: c# .net database multithreading caching

我有一个可以实时监控各种系统的应用程序。根据受监控的应用程序,我得到了不同字段的不同报告。我们每隔3分钟收集一次数据。这3分钟的间隔可以是120mb作为原始json和2-3mb作为拉链或gzipped json。我们正在压缩然后缓存到磁盘以通过从磁盘请求这些缓存,解压缩它们并将json数据加载到应用程序来避免数据库请求。我们将这些缓存保留3天到30天,具体取决于报告类型。

多年来我们一直使用磁盘缓存。压缩3分钟间隔数据,然后将其保存到磁盘。这导致我使用了很多锁和互斥锁。

我知道我不是唯一一个有这种问题的人。我的缓存很大。我的问题是;有没有更好的方法来保存这些数据并获得它?内存缓存对我来说不是一个解决方案,因为30天的数据不能存储在内存中,我无法为此应用程序向服务器添加内存。我需要别的东西。比磁盘更好的东西,没有使用锁。

P.S。 :应用程序也是多线程的。

1 个答案:

答案 0 :(得分:0)

我会考虑使用NoSQL存储引擎。我特别想到Redis。 Redis是一个具有持久性的内存,快速,键值存储,应该非常适合这种情况。然后,您可以将大部分锁定/一致性麻烦推迟到它。

Redis的问题在于你是否真的受到Windows环境的限制。有一个“非官方”的redis端口;这个端口是由微软自己完成的。但我承认,我不会非常有信心在生产中使用它。 对于C#客户端/库,有Booksleeve。这个网站(SO)使用它:)所以我敢打赌它非常稳定!

当然,您需要根据自己的需要定制Redis。 Redis确实提供了持久性,并且持久性是可配置的(参见http://redis.io/topics/persistence)。此外,它提供了对象的过期(http://redis.io/commands/expire),对于类似缓存的机制非常方便,并且能够从更简单的命令开始构建更复杂的原子命令。

我会使用Redis来处理内存缓存,将所有(主)密钥保留在内存中,数据同时存储在磁盘和内存中。与易失性密钥关联的内存数据。主键指向内存中的键和文件名;如果它指向的密钥无效,您可以重新加载数据并访问它。

这是一个复杂的解决方案,但它有两个优点:

  • 应该快速变化
  • 它将一些锁/等负担卸载到Redis
  • 应该很容易从您的解决方案迁移到此

或者,Redis还提供VM解决方案 http://oldblog.antirez.com/post/redis-virtual-memory-story.html,但我不知道它有多稳定,也没有尝试过。

另一种选择是探索其他NoSQL解决方案;既然你提到了JSON数据,我会看一下MongoDB。

最后,一个疯狂的想法......你是64位机器吗? 您是否考虑过“让操作系统处理它”,使用非常大的页面文件和页面文件支持的内存映射文件(或标准文件)?请注意,这可能是一个非常糟糕的想法......!但这可能是你可以尝试/研究的东西吗?