繁体   English   中英

缓存大数据

[英]Caching big data

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

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

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

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

我会考虑使用NoSQL存储引擎。 我在考虑Redis特别。 Redis是具有持久性的内存中快速键值存储,这很适合这种情况。 然后,您可以将大多数锁定/一致性问题归因于它。

Redis的问题是,如果您确实绑定到Windows环境。 Redis有一个“非正式”的端口; 该端口是由Microsoft自己完成的。.但我承认,在生产环境中使用该端口并不是很自信。 对于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位计算机吗? 您是否考虑过“让操作系统处理它”,其中包含一个非常大的页面文件和支持页面文件的内存映射文件(或者也是标准文件)? 请注意,这可能是一个非常糟糕的主意...! 但这是您可以尝试/研究的东西吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM