1

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

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

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

PS:应用程序也是多线程的。

4

1 回答 1

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 位机器上吗?您是否考虑过使用非常大的页面文件和页面文件支持的内存映射文件(或标准文件)“让操作系统处理它”?请注意,这可能是一个非常糟糕的主意......!但也许你可以尝试/研究一下?

于 2013-06-05T10:45:54.697 回答