处理内存中的实时数据有什么好处?

时间:2012-01-21 15:55:44

标签: mysql redis key-value-store

客户端将一些实时数据发送到服务器。服务器将使用这些数据进行简单分析。它只查找特定范围的数据,或者对某些数据进行排序。分析后大部分数据都将被放弃,因此无需将它们保存在磁盘中。

我想使用一些内存DB来处理它们。 MYSQL的内存引擎是一个不错的选择吗?如果我使用一些键值内存缓存引擎如Redis怎么样?因为我需要比较数据,可能纯粹的键值存储不能满足我的要求。

3 个答案:

答案 0 :(得分:3)

对我而言,没有数据库听起来似乎更好,但这取决于数据的结构以及您必须执行的操作类型。

如果结构简单且操作简单,那么您应该将数据存储在您正在使用的编程平台的数据结构中。

答案 1 :(得分:3)

  

如果我使用像Redis这样的键值内存缓存引擎怎么样?

Redis支持高级数据结构,这使得它成为一个非常方便的基于键值的数据存储,但是如果您的数据需要复杂的关系,那么您应该查看MongoDBOrientDB或{{3}这应该都支持基于内存的存储引擎。

答案 2 :(得分:2)

如果你打算使用MySQL的内存引擎,那么有一些问题:

  • 默认情况下,索引是使用哈希表而不是btree实现的。如果您需要对数据或范围支持进行排序,使用btree可能会更有趣。

  • 锁定粒度就是表格。有一个R / W锁可以防止并发DML操作。虽然原始性能并不差,但如果您同时拥有多个编写器,则可伸缩性不是很好。

  • 所有行都有固定宽度(请注意,如果您需要存储varchars ...)

此外,像大多数其他RDBMS一样,MySQL协议是同步的。每次客户端写入数据库时​​,他们都会等待回复。如果您有大量数据,那么批处理写操作几乎是强制性的,以获得良好的性能。

这实际上取决于数量,客户端数量和吞吐量。如果要求很低,那么任何存储解决方案(包括MySQL)都可以正常工作。现在,如果需要更高的性能或更高的可扩展性,那么其他解决方案可能会更好。

您想要编写的内容可能是DIRT应用程序(数据密集型实时)。良好的存储解决方案是MongoDB(upserts支持,单向协议用于写操作等)和Redis(内存,O(1)操作,流水线等等)。 根据您的需求,由于btree索引和map / reduce支持,MongoDB可以更轻松地进行数据建模和处理。使用Redis可能会有点复杂,但如果选择正确的数据结构,最终会得到更确定的性能。

最后,您可能还希望避免通过动态处理来存储数据。您可以使用流式引擎实现此目的,例如在高速交易平台上使用的引擎。例如,如果您已准备好使用Java编写代码,ESPER是一个出色的CEP解决方案,可以使用类似SQL的语言处理数据流和/或在流之间建立关联。