2012-01-21 2 views
2

Клиенты отправляют на сервер данные в реальном времени. Эти данные будут выполнять простой анализ. Он находит только данные определенного диапазона или сортирует некоторые данные. Большинство данных будут оставлены после анализа, поэтому нет необходимости сохранять их на диске.Какой хороший выбор для обработки данных в реальном времени в режиме реального времени?

Я хочу использовать некоторую память DB для обработки с ними. Является ли движок памяти MYSQL хорошим выбором? Как насчет того, использую ли я какой-то ключ кэш-памяти, например Redis? Потому что мне нужно сравнить данные, может быть, чистое хранилище ключей не может соответствовать моему требованию.

+0

Я не собираюсь делать полный ответ, но вы можете обнаружить, что MongoDB делает все, что вы хотите, - вы можете остановить его от покраски на диск, эффективно сделав его встроенной БД. Вариант использования: --syncdelay 0 – Rich

ответ

3

Для меня это звучит так, как будто это было лучше без базы данных, но это зависит от структуры ваших данных и того, какие операции вы должны выполнять.

Если структура проста и операции легки, то вам, вероятно, следует хранить данные в структурах данных используемой вами платформы программирования.

3

Как насчет того, если я использую некоторый механизм кэширования памяти с ключом, например Redis?

Redis поддерживает расширенные структуры данных, что делает его очень удобно на основе ключ-значение хранилища данных, однако, если ваши данные требует сложных отношений, то вы, вероятно, следует проверить MongoDB, OrientDB или Riak, которые должны все поддержки памяти двигателей хранения на основе ,

+1

Я бы не использовал Riak или OrientDB для нестабильных данных. MongoDB или Redis - гораздо лучший выбор для приложений DIRTy. –

+0

OrientDB поддерживает базы данных в памяти, где вы можете использовать мощный расширенный язык SQL, Graph API, Web Studio и т. Д. – Lvca

2

Если вы планируете использовать двигатель памяти MySQL, есть несколько моментов:

  • по умолчанию, индексы реализованы с использованием хэш-таблицы, а не btrees. Если вам нужно сортировать данные или поддерживать диапазон, использование btrees может быть более интересным.

  • блокировка гранулярности - это таблица. Для защиты от одновременных операций DML существует блокировка R/W. Хотя сырая производительность неплохая, масштабируемость не очень хороша, когда у вас много писателей одновременно.

  • все строки имеют фиксированную ширину (берегитесь, если вам нужно хранить VARCHARS ...)

Кроме того, как и большинство других СУБД, протокол MySQL является синхронным. Каждый раз, когда клиенты будут записывать в базу данных, они будут ждать ответа. Если у вас много данных, операции пакетной записи почти обязательны для получения хорошей производительности.

Это действительно зависит от объема, количества клиентов и пропускной способности. Если требования низки, то любое решение для хранения (включая MySQL) будет работать нормально. Теперь, если требуется более высокая производительность или большая масштабируемость, то другие решения, вероятно, будут лучше.

Что вы хотите написать, возможно, это приложение DIRT (с интенсивным использованием данных в реальном времени). Хорошими решениями для хранения данных являются MongoDB (поддержка upserts, протокол oneway для операций записи и т. Д.) И Redis (операции с памятью, O (1), конвейерная обработка и т. Д.). В зависимости от ваших потребностей моделирование и обработка данных, возможно, будет проще с MongoDB из-за индексов btree и поддержки карт/уменьшений. Вероятно, это будет немного сложнее с Redis, но если вы выберете правильную структуру данных, вы получите более детерминированную производительность.

Наконец, вы также можете избежать хранения данных путем их обработки на лету.Вы можете добиться этого с помощью потокового движка, такого как те, которые используются на высокоскоростных торговых платформах. Например, если вы готовы кодировать на Java, ESPER - отличное решение CEP для обработки потоков данных и/или установления корреляции между потоками, используя язык, подобный SQL.

+0

Ummm, что вы подразумеваете под **, все строки имеют фиксированную ширину (будьте осторожны, если вам нужно хранить varchars. ..) **? Означает ли это, что максимальное количество столбцов, которые может иметь строка, фиксировано или максимальное количество элементов, которые у меня есть в varchar, не может превышать заранее определенный предел? –

+0

Это означает, что varchar будет храниться точно так же, как char. См. Http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html. –