客户端向服务器发送一些实时数据。服务器将对这些数据进行简单的分析。它只查找特定范围内的数据,或对某些数据进行排序。大部分数据在分析后都会被丢弃,因此无需将它们保存在磁盘中。
我想使用一些内存数据库来处理它们。MYSQL的内存引擎是个不错的选择吗?如果我使用 Redis 之类的键值对内存缓存引擎怎么样?因为我需要比较数据,可能纯键值存储不能满足我的要求。
客户端向服务器发送一些实时数据。服务器将对这些数据进行简单的分析。它只查找特定范围内的数据,或对某些数据进行排序。大部分数据在分析后都会被丢弃,因此无需将它们保存在磁盘中。
我想使用一些内存数据库来处理它们。MYSQL的内存引擎是个不错的选择吗?如果我使用 Redis 之类的键值对内存缓存引擎怎么样?因为我需要比较数据,可能纯键值存储不能满足我的要求。
对我来说,这听起来好像没有数据库更好,但这取决于您的数据结构以及您必须执行的操作类型。
如果结构简单且操作容易,那么您可能应该将数据存储在您正在使用的编程平台的数据结构中。
如果你打算使用 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 的语言处理数据流和/或建立流之间的关联。