Как Redis помогает быстро получать справочники и состояние приложения, а Elasticsearch — искать и фильтровать туры. Разбираем их совместную работу в проекте Adventure Guide на примере регионов, типов туров и PHP-кода.
Содержание 3
Что делает Redis
Redis хранит рабочие данные в оперативной памяти и предоставляет быстрый доступ к ним. В веб-приложении его используют для кеширования, сессий и других операций, где важна скорость обращения к данным.
Его ценность определяется задачей: поддерживаемые структуры данных и операции позволяют выбрать способ хранения для конкретного сценария, от справочника до очереди сообщений.
- Быстродействие и масштабирование: работа в оперативной памяти сокращает задержки доступа к данным; распределение нагрузки помогает обслуживать растущий проект.
- Кеширование: часто запрашиваемые данные можно получать из Redis, снижая число обращений к основной базе.
- Сессии и состояние пользователей: общее хранилище позволяет работать с состоянием приложения на нескольких серверах.
- Структуры данных: строки, списки, хэши, множества и сортированные множества поддерживают разные сценарии хранения и обработки.
- Очереди и аналитика: структуры Redis применяют для асинхронных задач и обмена данными с аналитическими инструментами.
Как связаны Redis и Elasticsearch в Adventure Guide
Adventure Guide работает с туристическими данными: регионами, типами туров и другими параметрами каталога. Для сайта бронирования важно быстро получать эти справочники и одновременно выполнять поиск по выбранным условиям.
В описанной архитектуре Redis служит промежуточным хранилищем и кешем. Elasticsearch отвечает за поиск, фильтрацию и агрегации. Такое разделение позволяет получать часто используемые данные из памяти, а поисковые запросы направлять в специализированный индекс.
В примере ниже PHP-код читает из Redis массивы регионов и типов туров, формирует фильтры Elasticsearch и запрашивает количество найденных туров для регионов. Для русской и английской версий используются соответствующие поисковые индексы.
// Строим основной запрос
$common_elastic_query_build = build_elastic_query ($common_elastic_filter);
// Данная строка вызывает функцию redis_get_regions_array() с двумя аргументами (false и get_lang()).
// Функция извлекает массив регионов туров и присваивает его переменной $region_array.
$region_array = redis_get_regions_array(false, get_lang());
// Данная строка вызывает функцию redis_get_type_array() с двумя аргументами (false и get_lang()).
// Функция извлекает массив типов туров и присваивает его переменной $type_array.
$type_array = redis_get_type_array(false, get_lang());
if ($main_si_type_filter === 'type' || !empty($_GET['type'])) {
$temp_type = [];
if ($main_si_type_filter === 'type' && !empty($main_si_type_filter_id)) {
$temp_type[] = intval ($main_si_type_filter_id);
}
if (!empty($_GET['type'])) {
foreach ($_GET['type'] as $type) {
if (is_numeric($type)) {
$temp_type[] = intval ($type);
}
}
}
$common_elastic_filter['type'] = $temp_type;
}
// Данный цикл foreach выполняет итерацию по каждому элементу в массиве $region_array.
// Внутри цикла выполняются различные операции.
foreach ($region_array as $key => $value) {
$temp_common_elastic_filter = $common_elastic_filter;
$temp_common_elastic_filter['region'] = [$value['ID']];
$temp_elastic_query = build_elastic_query ($temp_common_elastic_filter);
$temp_elastic_query['_source'] = ['_id'];
$temp_elastic_query['size'] = 0;
if (get_lang () === 'ru') {
$region_array[$key]['COUNT'] = intval (get_elastic_result($temp_elastic_query)['hits']['total']['value']);
}
if (get_lang () === 'en') {
$region_array[$key]['COUNT'] = intval (get_elastic_result($temp_elastic_query, 'adventure_en')['hits']['total']['value']);
}
}Проект Адвенче является ярким примером успешного использования Redis и ElasticSearch для хранения и поиска туристической информации. Результаты этого проекта подчеркивают важность Redis в современной разработке веб-сайтов и сервисов.
Что даёт такое разделение
Redis ускоряет доступ к часто используемым данным, а Elasticsearch обеспечивает поиск по туристическому каталогу. В проекте Adventure Guide эти инструменты дополняют друг друга: один обслуживает быстрые обращения к данным, другой — поисковые запросы и фильтры.



Загружаем комментарии…