Открыть сервис

RedisGraph

RedisGraph — это модуль для системы управления базами данных Redis, реализующий графовую базу данных, которая хранит данные в виде вершин (узлов) и рёбер (связей) и поддерживает запросы на языке Cypher (подмножество стандарта openCypher). RedisGraph использует собственную технологию хранения и обработки графов на основе сжатых разреженных матриц (Compressed Sparse Graph, CSG), что позволяет выполнять сложные графовые алгоритмы (например, поиск кратчайшего пути, кластеризация) с высокой производительностью. Модуль был разработан компанией Redis Ltd. (до 2020 года — Redis Labs) и впервые выпущен в 2018 году.

История

Разработка RedisGraph началась в 2017 году как внутренний проект Redis Labs, направленный на расширение функциональности Redis за пределы традиционных структур данных (строки, списки, множества). Первая публичная версия (альфа-релиз) вышла в апреле 2018 года. В 2019 году RedisGraph был включён в состав Redis Enterprise (коммерческая версия Redis) и стал доступен в облачном сервисе Redis Enterprise Cloud. В 2020 году модуль получил поддержку полного набора операций ACID (атомарность, согласованность, изоляция, долговечность) для графовых транзакций. По состоянию на 2024 год RedisGraph остаётся одним из наиболее производительных графовых модулей для Redis, хотя его развитие замедлилось в пользу других направлений (например, Redis Stack).

Архитектура и принцип работы

Хранение данных

В отличие от традиционных графовых баз данных (например, Neo4j), которые хранят графы в виде списков смежности или индексов, RedisGraph использует сжатые разреженные матрицы (Compressed Sparse Row, CSR). Каждый тип узла и тип ребра представляется отдельной матрицей, где строки соответствуют узлам-источникам, столбцы — узлам-назначениям, а значения — свойствам рёбер. Это позволяет выполнять операции над графами (например, пересечение, объединение, фильтрацию) с помощью быстрых матричных операций, реализованных на языке C.

Язык запросов

RedisGraph поддерживает язык Cypher (подмножество openCypher), который используется для создания, чтения, обновления и удаления графовых данных (CRUD). Пример запроса на создание узла и ребра:

`` GRAPH.QUERY social_network "CREATE (:Person {name: 'Alice', age: 30})-[:KNOWS]->(:Person {name: 'Bob', age: 25})" ``

Для выполнения запросов используется команда GRAPH.QUERY, которая принимает имя графа и строку запроса на Cypher. Результаты возвращаются в виде таблицы с колонками, соответствующими возвращаемым переменным.

Индексация

RedisGraph поддерживает индексацию по свойствам узлов, что ускоряет выполнение запросов с фильтрацией (например, WHERE n.age > 25). Индексы создаются командой GRAPH.QUERY с использованием синтаксиса CREATE INDEX ON :Person(age). Индексы хранятся в виде хеш-таблиц Redis, что обеспечивает быстрый доступ.

Классификация и виды

RedisGraph относится к классу графовых баз данных (Graph DBMS) и может быть классифицирован по следующим признакам:

  • По модели данных: граф свойств (Property Graph) — узлы и рёбра могут иметь произвольные свойства в виде пар «ключ-значение».
  • По способу хранения: резидентная база данных (in-memory) — все данные хранятся в оперативной памяти, что обеспечивает высокую скорость доступа, но ограничивает объём данных доступной памятью.
  • По архитектуре: модуль для Redis — не является самостоятельной СУБД, а расширяет функциональность Redis, используя его инфраструктуру (репликация, кластеризация, персистентность).

Характеристики

Производительность

RedisGraph демонстрирует высокую производительность на графовых запросах, особенно на операциях, сводимых к матричным вычислениям. По данным бенчмарков (например, LDBC Social Network Benchmark), RedisGraph может обрабатывать до 10–15 миллионов транзакций в секунду на одном узле с 64 ГБ ОЗУ, что в несколько раз быстрее многих других графовых баз данных (Neo4j, JanusGraph) на аналогичных аппаратных конфигурациях. Однако производительность падает при выполнении запросов с большим количеством обходов графа (например, рекурсивные пути неограниченной длины).

Масштабируемость

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

Персистентность

RedisGraph наследует механизмы персистентности Redis: снимки (RDB) и журналы операций (AOF). При сбое системы данные могут быть восстановлены до последнего сохранённого состояния. Однако из-за резидентной природы все данные должны помещаться в оперативную память, что ограничивает максимальный размер графа объёмом доступной ОЗУ.

Применение

RedisGraph используется в сценариях, где требуется быстрый анализ связей между объектами в реальном времени:

Примеры

Пример 1: Создание графа социальной сети

`` GRAPH.QUERY social_network "CREATE (alice:Person {name: 'Alice', age: 30}), (bob:Person {name: 'Bob', age: 25}), (alice)-[:KNOWS {since: 2020}]->(bob)" ``

Пример 2: Поиск друзей друзей

`` GRAPH.QUERY social_network "MATCH (alice:Person {name: 'Alice'})-[:KNOWS]->(friend)-[:KNOWS]->(friend_of_friend) RETURN friend_of_friend.name" ``

Пример 3: Анализ кратчайшего пути

`` GRAPH.QUERY road_network "MATCH (a:City {name: 'Moscow'}), (b:City {name: 'Saint Petersburg'}), p = shortestPath((a)-[:ROAD*]->(b)) RETURN p" ``

Критика

Основные недостатки RedisGraph:

  • Ограничение по памяти: все данные должны помещаться в оперативную память, что делает его непригодным для графов размером более нескольких десятков гигабайт без значительных затрат на оборудование.
  • Отсутствие полноценного шардирования: графы не могут быть автоматически распределены по кластеру, что ограничивает горизонтальное масштабирование.
  • Ограниченная поддержка рекурсивных запросов: операции с обходом графа на произвольную глубину (например, * в Cypher) могут быть медленными из-за отсутствия оптимизации для таких случаев.
  • Зависимость от Redis: модуль не может работать без Redis, что создаёт дополнительные накладные расходы на управление инфраструктурой Redis.

Сравнение с другими графовыми базами данных

ХарактеристикаRedisGraphNeo4jJanusGraph
Тип храненияРезидентный (in-memory)Дисковый (on-disk)Дисковый (on-disk)
Язык запросовCypher (openCypher)Cypher (собственный)Gremlin (TinkerPop)
Производительность (на графовых запросах)Очень высокаяВысокаяСредняя
Максимальный размер графаОграничен ОЗУДо нескольких терабайтДо нескольких петабайт
Поддержка ACIDДа (с 2020 года)ДаЧастичная
ШардированиеРучноеАвтоматическое (Enterprise)Автоматическое

Интересные факты

  • RedisGraph использует библиотеку GraphBLAS (Graph Basic Linear Algebra Subprograms) для выполнения матричных операций, что позволяет задействовать SIMD-инструкции процессора для ускорения вычислений.
  • В 2021 году RedisGraph был включён в состав Redis Stack — набора модулей Redis для разработки приложений, включающего также RedisJSON, RedisSearch и RedisTimeSeries.
  • По состоянию на 2024 год RedisGraph не поддерживает полноценную репликацию графов между разными экземплярами Redis — репликация осуществляется на уровне Redis, а не на уровне графовых данных.

Источники

  • Redis Ltd. (2023). RedisGraph Documentation. Redis Labs.
  • LDBC (Linked Data Benchmark Council). (2020). Social Network Benchmark (SNB) Results.
  • RedisGraph GitHub Repository. (2018–2024). RedisGraph: Graph Database Module for Redis.
  • JanusGraph Project. (2022). JanusGraph Documentation.
  • Neo4j, Inc. (2023). Neo4j Graph Database Platform.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →