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