2

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

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

4

3 回答 3

3

如果我使用 Redis 之类的键值对内存缓存引擎怎么样?

Redis 支持高级数据结构,这使其成为非常方便的基于键值的数据存储,但是如果您的数据需要复杂的关系,那么您可能应该查看MongoDBOrientDBRiak,它们都应该支持基于内存的存储引擎。

于 2012-01-21T21:28:25.420 回答
3

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

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

于 2012-01-21T16:05:05.430 回答
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 的语言处理数据流和/或建立流之间的关联。

于 2012-01-22T10:46:07.147 回答