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 →