Почему Redis обрабатывает запросы в 5 раз медленнее, чем прямой запрос к базе данных?

Почему время выполнения запросов к данным в Redis составляет 400-500 мс, в то время как при обращении напрямую к базе данных оно составляет 80-110 мс? Вот примеры запросов: <br/><br/> Redis: <br/><pre><code class="javascript">const localeCities = await this.redis.get('locale_cities');  
const data = localeCities.filter(  
    (city) =&gt; city.name_en.toLowerCase().includes(place.toLowerCase())  
);</code></pre> <br/> Непосредственно в базе данных: <br/><pre><code class="javascript">const data = await this.localeCityRepository  
    .createQueryBuilder('city')  
    .where('LOWER(city.name_en) LIKE :place', { place: `%${place.toLowerCase()}%` })  
    .getMany();  
</code></pre>
  • 24 сентября 2024 г. 8:53
Ответы на вопрос 2
Медленная работа с Redis по сравнению с прямыми запросами к базе данных может быть вызвана несколькими факторами. Давайте рассмотрим некоторые из них:

1. **Сетевые задержки**: Если ваш Redis-сервер находится на другом хосте или сервисе, то каждая операция с Redis включает сетевые задержки. Обращения к базе данных могут происходить локально, что значительно уменьшает время ответа по сравнению с сетевыми запросами.

2. **Обработка данных**: Когда вы запрашиваете данные из Redis с помощью `this.redis.get('locale_cities')`, вы получаете не структурированные данные (например, строку или JSON), которые затем необходимо обработать в приложении. В данном случае вы фильтруете данные на уровне приложения, что может занять значительное время, особенно если набор данных велик.

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

3. **Формат хранения данных**: Данные в Redis могут храниться в виде строк или других упрощенных форматов. При запросе вы, возможно, должны дополнительно парсить данные (например, если они хранятся в JSON-формате), что также добавляет время выполнения. В случае базы данных данные сразу доступны в структурированном виде.

4. **Массив данных**: Если данные `localeCities` содержат большое количество записей, фильтрация на JavaScript-стороне может быть медленнее по сравнению с выполнением аналогичной операции в базе данных, которая может использовать индексы для ускорения фильтрации.

5. **Масштабируемость и настройки**: База данных, как правило, имеет встроенные механизмы оптимизации запросов, такие как кэширование, индексация, партиционирование и т. д. Redis в этом случае может быть не так оптимизирован для крупных объемов данных, если не разработана соответствующая стратегия кэширования и хранения.

### Рекомендации:
- **Предварительная фильтрация**: Попробуйте сместить часть логики фильтрации на уровень базы данных при использовании Redis.
- **Данные в более удобном формате**: Вы можете хранить данные в Redis в более структурированном формате, чтобы избежать дополнительных затрат на обработку.
- **Мониторинг производительности**: Используйте инструменты для мониторинга Redis и вашей базы данных, чтобы проанализировать производительность и выявить узкие места.
- **Тестирование и профилирование**: Проведите тестирование и профилирование вашего кода, чтобы лучше понять, где происходят задержки.

Понимание того, какие аспекты вашего кода и архитектуры влияют на производительность, поможет в оптимизации работы с Redis и базой данных.
Так в Postgres ты производишь выборку на стороне СУБД, а в случае с Redis выгружаешь всё по сети. Если в среднем строка весит 100 байт (а ты JSON используешь, так что там и больше быть может), то ты гоняешь по сети 10 000 * 100 байт, то есть примерно мегабайт памяти. Так и потом ты этот JSON разбираешь в JS (в нём же, да?), в то время как Postgres разбирает таблицу в C++.
Похожие вопросы