【问题标题】:Caching big data缓存大数据
【发布时间】:2013-05-31 18:07:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请澄清以下内容:(1)“我们正在压缩它们以避免数据库请求”(2)报告和缓存之间的关系(3)为什么“内存缓存不是我的解决方案。”跨度>
  • 所以您每天有 480 个间隔,每个间隔 120mb(每天大约 56GB 的未压缩数据)?无论您是点击数据库、文件还是 cpu 周期来压缩,这都是很多 IO。我在一个 VoIP 应用程序上工作,我们将音频压缩为 mp3,在本地使用文件系统直到达到某个阈值,然后卸载到网络共享或 FTP。所以,我没有比你已经在做的更好的答案了。
  • 是的,但就像我说的,120mb 的 json 文件可以压缩到 2mb。所以 1 间隔是 2 mb 一整天 1 个监测报告是一个演出。
  • 我假设传入的数据流一旦进入,以后不会被修改。正确的?您是否有多个编写器或多个/并行数据流?读者如何与系统交互并使用缓存?并且对“这导致我使用了很多锁和互斥锁”这一声明进行了更多澄清。
  • 你考虑过一些 NoSQL 存储引擎吗?我特别在考虑 redis ......它是一个内存中的、快速的、具有持久性的键值存储,应该非常适合这种场景。然后,您可以将大部分锁定/一致性问题交给它。

标签: c# .net database multithreading caching


【解决方案1】:

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

【讨论】:

  • 感谢您的精彩解释。如果我要使用 Redis。我将如何在其中存储我的 zip 文件?喜欢将 Zip 文件转换为二进制文件还是只是其中的 json 字符串?
  • 键和值是二进制安全字符串 (redis.io/topics/data-types-intro),因此您甚至可以将压缩后的字节存储在值中。
猜你喜欢
  • 2018-09-07
  • 2012-02-08
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多