【问题标题】:What's the good choice for handling with real-time data in memory?处理内存中的实时数据的好选择是什么?
【发布时间】:2012-01-21 15:55:43
【问题描述】:

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

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

【问题讨论】:

  • 我不会给出完整的答案,但您可能会发现 MongoDB 可以满足您的需求 - 您可以阻止它刷新到磁盘,从而有效地使其成为内存数据库。使用的选项是:--syncdelay 0

标签: mysql redis key-value-store


【解决方案1】:

在我看来,没有数据库会更好,但这取决于您的数据结构以及您必须执行的操作类型。

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

【讨论】:

    【解决方案2】:

    如果我使用一些key-value内存缓存引擎比如Redis呢?

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

    【讨论】:

    • 我不会将 Riak 或 OrientDB 用于易失性数据。 MongoDB 或 Redis 是 DIRTy 应用程序的更好选择。
    • OrientDB 支持内存数据库,您可以在其中使用强大的扩展 SQL 语言、Graph API、Web Studio 等。
    【解决方案3】:

    如果你打算使用 MySQL 的内存引擎,有几个问题:

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

    • 锁定粒度是表。有一个 R/W 锁来防止并发 DML 操作。虽然原始性能还不错,但当您同时有许多写入器时,可扩展性就不是很好。

    • 所有行都有固定的宽度(如果您需要存储 varchar,请小心...)

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

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

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

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

    【讨论】:

    • 嗯,你说的所有行都有一个固定的宽度是什么意思(如果你需要存储varchars ...)?这是否意味着一行可以拥有的最大列数是固定的,或者我在 varchar 中拥有的最大元素数不能超过预先确定的限制?
    • 这意味着 varchar 将像 char 一样存储。见percona.com/doc/percona-server/5.5/flexibility/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2022-12-10
    • 2013-05-14
    相关资源
    最近更新 更多