Задать вопрос

Redis vs SQLite vs PostgreSQL

Решил сравнить производительность указанных БД для нескольких болльших плоских таблиц и простейших запросов (по ключу, по индексу и т.п.). Представил одинаковую предметную область — очередь сообщений: для SQLite и PostgreSQL это одинаковые схемы, для Redis использовались сортированные списки, т.к. другие варианты хранения не подошли для описанной задачи. Запросы: поиск сообщения по ключу, удаление сообщения по ключу из очереди, выборка сообщений старше n минут, выборка и удаление сообщения из начала очереди.

10 млн строк, все базы занимают почти по 2 ГБ (больше к сожалению не было RAM). Результат: если база влазит в память, то скорость выполнения запросов примерна одинакова для разных «СУБД» (простые операции — около 3000 операций в секунду, посложнее — около 600). В чём же тогда прелесть Redis-а? Понимаю, что он подходит для узконаправленных задач, например, только поиск по ключу, т.е. для ограниченных по размеру кешей. В остальном одни минусы: и за памятью следи, чтобы база влезала в RAM (PG же просто замедлиться перейдя к дисковому чтению, Redis же начнёт свопится); и набор команд и типов данных ограничен.

PS: Что вы используете для надёжного перманентного хранения данных и быстрого выполнения простых запросов? Холивар PG vs MySQL можно опустить, разницы между ними практически не будет.
  • Вопрос задан
  • 16376 просмотров
Подписаться 18 Оценить Комментировать
Решение пользователя Maxim Avanov К ответам на вопрос (7)
@Ghostwriter
1. В Redis лучше представлена работа с коллекциями. Простой пример — инкрементальный счётчик. Вы делаете incrby/hincrby для любого ключа, не заботясь о его наличие в хранилище. В Postgres аналогичная функциональность на основе последовательностей (nextval('foo')) подразумевает, что вы уже создали последовательность 'foo' ранее. Это подталкивает вас на написание процедур, которые перед попыткой изменить счётчик, сначала проверяют его наличие, при необходимости создают его и только потом изменяют. Больше ручной работы.

2. Структуры данных в Redis оптимизированы либо под быстрый поик О(1), либо под компактность и приемлемую произволительность O(N), O(log(N)). Практически всегда получается обходиться простыми или вложенными хеш-таблицами с О(1) или О(n). В Postgres вы практически всегда пользуетесь той или иной разновидностью B/R-tree, GiST/GIN индексов со сложностью O(log(N)(+N)). До версии 8.4, индексы типа HASH в Postgres имели практически схожую с B-tree скорость поиска, поэтому их применение не имело никакого смысла. Сейчас, в версии 9.1, смысла стало больше, но не намного — HASH индексы не поддерживают Write-Ahead Log и при сбоях требуют ручной переиндексации:
"Hash index operations are not presently WAL-logged, so hash indexes might need to be rebuilt with REINDEX after a database crash. They are also not replicated over streaming or file-based replication. For these reasons, hash index use is presently discouraged." http://www.postgresql.org/docs/9.1/static/indexes-types.html

У себя в проектах, я использую и Redis, и Postgres. Первый — как эффективную систему для сбора онлайн-статистики (счетчики-лайки, различные метрики), а второй — как хранилище для пользовательских аккаунтов и контента с его мета-информацией. При этом, наметилась тенденция переносить контент на HBase, оставляя для Postgres только задачи по ACID-обслуживанию операций с пользовательскими аккаунтами.
Ответ написан
Комментировать