← Все статьи
Riders AgencyТексты и контент-редакторы

Redis и Elasticsearch в туристическом каталоге Adventure Guide

Как Redis помогает быстро получать справочники и состояние приложения, а Elasticsearch — искать и фильтровать туры. Разбираем их совместную работу в проекте Adventure Guide на примере регионов, типов туров и PHP-кода.

Содержание 3

Что делает Redis

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

Его ценность определяется задачей: поддерживаемые структуры данных и операции позволяют выбрать способ хранения для конкретного сценария, от справочника до очереди сообщений.

  • Быстродействие и масштабирование: работа в оперативной памяти сокращает задержки доступа к данным; распределение нагрузки помогает обслуживать растущий проект.
  • Кеширование: часто запрашиваемые данные можно получать из Redis, снижая число обращений к основной базе.
  • Сессии и состояние пользователей: общее хранилище позволяет работать с состоянием приложения на нескольких серверах.
  • Структуры данных: строки, списки, хэши, множества и сортированные множества поддерживают разные сценарии хранения и обработки.
  • Очереди и аналитика: структуры Redis применяют для асинхронных задач и обмена данными с аналитическими инструментами.

Как связаны Redis и Elasticsearch в Adventure Guide

Adventure Guide работает с туристическими данными: регионами, типами туров и другими параметрами каталога. Для сайта бронирования важно быстро получать эти справочники и одновременно выполнять поиск по выбранным условиям.

В описанной архитектуре Redis служит промежуточным хранилищем и кешем. Elasticsearch отвечает за поиск, фильтрацию и агрегации. Такое разделение позволяет получать часто используемые данные из памяти, а поисковые запросы направлять в специализированный индекс.

В примере ниже PHP-код читает из Redis массивы регионов и типов туров, формирует фильтры Elasticsearch и запрашивает количество найденных туров для регионов. Для русской и английской версий используются соответствующие поисковые индексы.

PHP
// Строим основной запрос
$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 эти инструменты дополняют друг друга: один обслуживает быстрые обращения к данным, другой — поисковые запросы и фильтры.

Источники

Обсуждение

Задайте вопрос об этой работе, обсудите решение или поделитесь своим опытом.

Обсуждение открыто для всех участников.

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