2016-12-15 2 views
1

В настоящее время я работаю над проектом, в котором мы рассматриваем переход на Redis в качестве базы данных. Характер наших данных чрезвычайно прост и кажется подходящим для Redis. Не имея опыта работы с Redis, я сделал очень маленький тестовый тест, чтобы сравнить его с PostgreSQL с точки зрения производительности вставки (что важно для нас).Redis кажется медленнее, чем PostgreSQL на вставках

Я создал файл .sql с 200000 инструкциями INSERT в простую схему (address [key], timestamp, value). Вставка заняла около 6 секунд.

Для Redis, каждый из 200000 записей вставляется:

HSET data:address timestamp <VALUE> 
HSET data:address value <VALUE> 

демпинга все в Redis с time redis-cli < insert_data.redis занимает 16 секунд. Я понимаю, что этот «тест» очень прост, но мне что-то не хватает на моей стороне, что позволяет PostgreSQL выйти на первое место? Я не могу себе представить, что Redis на медленных позициях на вставках.

+0

Сколько времени занимает PostgreSQL? Вы пробовали конвейерные запросы? Накладные расходы клиента, вероятно, сокращаются до общего времени. –

+0

Это 6s (Redis) против 16s (PostgreSQL). Я пробовал данные кошки.txt | redis-cli --pipe', так как это было описано здесь: https://redis.io/topics/mass-insert и показалось более разумным. Однако инструкции HSET, как показано выше, не принимаются, и вместо этого я получаю сообщения об ошибках синтаксиса. – user318592009

+0

Какая ошибка? –

ответ

2

Этот результат логичен. Чтобы понять результаты эталонного теста, важно понять действия, инициированные в системе.

Оба клиента Redis и PostgreSQL работают синхронно со своими соответствующими серверами. Для каждого оператора они отправляют запрос и ожидают ответа перед обработкой следующего оператора.

На таком томе в памяти много вещей (даже с PostgreSQL). Кроме того, здесь нет параллелизма. Таким образом, стоимость операций не зависит от операций ввода-вывода или индексации, а путем округления транзакций между клиентом и сервером.

Теперь, сколько раундов совершают каждый тест?

С помощью PostgreSQL у вас есть одно утверждение для каждой записи, в результате чего получается 200000 обращений в оба конца. С Redis у вас есть два заявления на запись, в результате чего 400000 обращений. Кроме того, обратные вызовы Redis систематически включают ключевые слова вашей схемы (данные, временную метку, значение), и адрес отправляется дважды на запись. Таким образом, намного больше данных обменивается с помощью теста Redis.

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

Чтобы улучшить результат с помощью redis-cli, вы можете использовать команду HMSET для отправки только одного оператора на запись.

HSET data:address timestamp <VALUE> 
HSET data:address value <VALUE> 

становится:

HMSET data:address timestamp <VALUE> value <VALUE> 

Но реальный прирост здесь будет использовать pipelining. К сожалению, вы не можете использовать его из redis-cli, за исключением того, что полагаетесь на опцию --pipe. Для этого параметра вам необходимо создать фактический протокол Redis вместо текстовых команд. Вот почему ваш тест с «cat data.txt | redis-cli -pipe» не может работать. Генерировать Redis protocol из простых команд оболочки не удобно.

Для такого теста я настоятельно рекомендую использовать вашу собственную клиентскую программу, а не redis-cli. Даже то, что написано на Python, Ruby или Javascript, приведет к интересной производительности, если используется конвейерная обработка.

+0

Спасибо за подробное объяснение, это действительно помогло. Я наткнулся на протокол Redis, но мне это показалось очень запутанным, и я понятия не имею, как я перевел команды HSET или HMSET. Как вы рекомендуете, я переключусь на небольшой клиент Python и сделаю то же самое для PostgreSQL, чтобы выровнять игровое поле. – user318592009

Смежные вопросы