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

JSON.GET

JSON.GET — это команда (функция) модуля RedisJSON, предназначенная для извлечения данных, хранящихся в формате JSON (JavaScript Object Notation), из базы данных Redis. Команда позволяет получать как весь JSON-документ целиком, так и его отдельные части, используя синтаксис JSONPath (путь к элементу внутри структуры). JSON.GET является одной из основных команд для чтения данных в RedisJSON, наряду с JSON.SET (запись) и JSON.DEL (удаление).

Синтаксис и параметры

Команда имеет следующий синтаксис:

`` JSON.GET <key> [<path> [<path> ...]] ``

  • <key> — ключ Redis, под которым хранится JSON-документ. Если ключ не существует или содержит данные не в формате JSON (например, обычную строку или число), команда возвращает ошибку.
  • <path> — один или несколько путей JSONPath, указывающих на извлекаемые элементы. Если пути не указаны, команда возвращает весь документ, начиная с корневого элемента ($). Пути могут быть как абсолютными (например, $.name), так и относительными (например, $..price). Допускается указание нескольких путей: в этом случае результат возвращается в виде объекта, где ключами являются сами пути, а значениями — соответствующие данные.

Поведение и возвращаемые значения

Команда возвращает строку в формате JSON, содержащую запрошенные данные. Если указан один путь, возвращается значение по этому пути. Если указано несколько путей, возвращается объект с ключами-путями и значениями. Если путь не найден (например, обращение к несуществующему полю), команда возвращает null для этого пути.

Примеры:

  • JSON.GET user:1 — возвращает весь JSON-документ, хранящийся по ключу user:1.
  • JSON.GET user:1 $.name — возвращает значение поля name (например, "Иван").
  • JSON.GET user:1 $.address.city $.address.street — возвращает объект вида {"$.address.city": "Москва", "$.address.street": "Тверская"}.

Поддержка JSONPath

RedisJSON использует расширенный синтаксис JSONPath, основанный на стандарте, предложенном Стефаном Гёсснером (Stefan Gössner). Поддерживаются следующие операции:

  • $корневой элемент.
  • . — доступ к свойству объекта (например, $.name).
  • [] — доступ к элементу массива по индексу (например, $.items[0]).
  • .. — рекурсивный поиск (например, $..price найдёт все поля price на любом уровне вложенности).
  • — подстановка для всех свойств объекта или элементов массива (например, $.).
  • [start:end:step] — срезы массива (например, $.items[0:3]).
  • [?(<expression>)] — фильтрация по условию (например, $.items[?(@.price > 100)]).

Фильтрация поддерживает операторы сравнения (==, !=, <, >, <=, >=), логические операторы (&&, ||, !), а также функции, такие как @.length() (длина строки или массива) и @.type() (тип значения).

Производительность и ограничения

Команда JSON.GET выполняется за время O(N), где N — размер извлекаемого JSON-документа или его части. При извлечении больших документов (например, более 10 МБ) может наблюдаться увеличение задержки, особенно при передаче данных по сети. RedisJSON оптимизирован для работы с документами размером до нескольких мегабайт; для более крупных данных рекомендуется использовать сериализацию и хранение в виде отдельных строк или бинарных данных.

Ограничения:

  • Максимальный размер одного JSON-документа в RedisJSON — 512 МБ (ограничение самого Redis).
  • Глубина вложенности не ограничена, но практические рекомендации — не более 128 уровней.
  • Пути JSONPath не должны содержать пробелов или специальных символов без экранирования.

Примеры использования

Извлечение всего документа

`` 127.0.0.1:6379> JSON.SET user:1 $ '{"name":"Иван","age":30,"address":{"city":"Москва","street":"Тверская"}}' OK 127.0.0.1:6379> JSON.GET user:1 "{\"name\":\"Иван\",\"age\":30,\"address\":{\"city\":\"Москва\",\"street\":\"Тверская\"}}" ``

Извлечение вложенного поля

`` 127.0.0.1:6379> JSON.GET user:1 $.address.city "\"Москва\"" ``

Извлечение нескольких полей

`` 127.0.0.1:6379> JSON.GET user:1 $.name $.age "{\"$.name\":\"Иван\",\"$.age\":30}" ``

Использование фильтрации

`` 127.0.0.1:6379> JSON.SET products:1 $ '[{"name":"Товар1","price":100},{"name":"Товар2","price":200}]' OK 127.0.0.1:6379> JSON.GET products:1 '$[?(@.price > 150)]' "[{\"name\":\"Товар2\",\"price\":200}]" ``

Применение

Команда JSON.GET широко используется в сценариях, где требуется хранение и быстрый доступ к структурированным данным в Redis:

  • Кэширование сложных объектов — например, профилей пользователей, корзин покупок, конфигураций.
  • Хранение сессионных данных — JSON-документы с информацией о сессии могут быть извлечены целиком или частично.
  • Работа с API-ответами — кэширование ответов от внешних сервисов в формате JSON.
  • Аналитика и логирование — хранение событий в виде JSON-массивов с возможностью выборочного чтения.

Сравнение с другими командами

  • JSON.GET — только чтение; для записи используется JSON.SET, для удаления — JSON.DEL.
  • JSON.MGET — позволяет получить JSON-документы по нескольким ключам одновременно (аналог MGET для JSON).
  • JSON.TYPE — возвращает тип JSON-значения по указанному пути (строка, число, объект, массив, логическое значение, null).

История и версии

Команда JSON.GET была введена в модуле RedisJSON версии 1.0.0, выпущенном в 2018 году. Модуль RedisJSON является частью экосистемы Redis Stack (ранее Redis Labs) и распространяется под лицензией Redis Source Available License (RSAL). В 2024 году Redis изменил лицензию на SSPL (Server Side Public License), что повлияло на условия использования модуля в коммерческих продуктах. Существуют форки RedisJSON с открытым исходным кодом, например, от сообщества Valkey.

Источники

  • Официальная документация RedisJSON: «JSON.GET» — Redis.io.
  • Спецификация JSONPath: Stefan Gössner, «JSONPath — XPath for JSON».
  • Redis Stack Documentation: «RedisJSON module» — Redis.io.
  • Репозиторий RedisJSON на GitHub (Redis/RedisJSON).

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

На главную BFOmetr →