2025-03-22 19:35:31 +00:00
## Краткая документация Futriix-JSON
2025-03-22 19:05:46 +00:00
2025-03-22 19:48:03 +00:00
<!-- PROJECT LOGO -->
< br / >
2025-03-22 19:50:05 +00:00
< div align = "center" >
2025-03-22 19:48:03 +00:00
<!-- <a href="https://github.com/othneildrew/Best - README - Template"> -->
< img src = "Logo-Futriix.png" height = 100 > < / img >
< / a >
2025-03-22 19:50:05 +00:00
< / div >
2025-03-22 19:48:03 +00:00
2025-03-22 19:05:46 +00:00
<!-- TABLE OF CONTENTS -->
< br >
< details >
< summary > < b > Содержание< / b > < / summary >
< ol >
< li >
< a href = " #о -проекте" > О проекте</ a >
< / li >
< li >< a href = " #компиляция " > Компиляция</ a ></ li >
< li >< a href = " #использование " > Использование</ a ></ li >
2025-03-22 19:35:31 +00:00
< li >< a href = " #ограничения " > Ограничения</ a ></ li >
2025-03-22 19:40:15 +00:00
< li >< a href = " #команды " > Команды</ a ></ li >
2025-03-22 19:42:16 +00:00
< li >< a href = " #ключи " > Ключи</ a ></ li >
2025-03-22 19:37:36 +00:00
< / ol >
2025-03-22 19:05:46 +00:00
< / details >
2025-03-22 19:49:18 +00:00
# Futriix JSON
2025-03-22 19:35:31 +00:00
Futriix-json is a C++ Futriix-Модуль,который обеспечивает встроенную поддержку JSON (JavaScript Object Notation) для Futriix. Реализация соответствует стандартам обмена данными RFC7159 и ECMA-404 JSON. Пользователи могут хранить, запрашивать и изменять структуры данных JSON с помощью языка запросов JSONPath. Выражения запроса поддерживают расширенные возможности, включая выбор с подстановочными знаками, выражения фильтров, срезы массива, операции объединения и рекурсивный поиск. Futriix-json использует [RapidJSON ](https://rapidjson.org/ ), высокопроизводительный JSON-парсер и генератор для C++, выбранный за е г о компактность и исключительную производительность и эффективность памяти. Будучи библиотекой только для заголовков без внешних зависимостей, RapidJSON обеспечивает надежную поддержку Unicode, сохраняя при этом компактный профиль памяти всего 16 байт на значение JSON на большинстве 32/64-разрядных машин.
2024-11-29 07:47:54 -08:00
2025-03-22 19:35:31 +00:00
## Компиляция
2024-11-29 07:47:54 -08:00
2025-03-22 19:35:31 +00:00
#### Компиляция модуля и запуск тестов
2024-11-29 07:47:54 -08:00
```text
2025-03-22 19:35:31 +00:00
# Компилирет futriix-server (нестабильную-ветку) и запускает интеграционные тесты
2024-11-29 07:47:54 -08:00
./build.sh
2024-12-09 18:14:48 -05:00
```
2024-11-29 07:47:54 -08:00
2025-03-22 19:35:31 +00:00
По умолчанию версия futriix является "нестабильной". Для того чтобы изменить ветку выполните команду:
2024-12-09 18:14:48 -05:00
```text
2025-03-22 19:35:31 +00:00
# Компилирет futriix-server () и запускает интеграционные тесты
2025-02-21 10:21:20 -05:00
SERVER_VERSION=8.0 ./build.sh
2024-11-29 07:47:54 -08:00
```
2025-03-22 19:35:31 +00:00
Пользовательские флаги компилятора могут быть переданы в скрипт сборки через переменную окружения CFLAGS. Например:
2024-12-09 19:56:14 -05:00
```text
CFLAGS="-O0 -Wno-unused-function" ./build.sh
```
2025-03-22 19:59:32 +00:00
#### Сборка модуля с помощью [ASAN](https://github.com/google/sanitizers/wiki/AddressSanitizer)
2025-03-14 15:34:40 -07:00
```text
export ASAN_BUILD=true
./build.sh
```
2024-12-09 19:56:14 -05:00
2025-03-22 19:35:31 +00:00
#### Чтобы собрать только модуль
2024-11-29 07:47:54 -08:00
```text
2025-03-14 14:54:00 -07:00
mkdir build
2024-11-29 07:47:54 -08:00
cd build
2024-12-09 18:14:48 -05:00
cmake ..
make
```
2025-03-22 19:35:31 +00:00
Версия futriix по умолчанию — «нестабильная». Чтобы переопределить е г о , выполните следующие действия:
2024-12-09 18:14:48 -05:00
```text
2025-03-14 14:54:00 -07:00
mkdir build
2024-12-09 18:14:48 -05:00
cd build
2025-02-21 10:21:20 -05:00
cmake .. -DVALKEY_VERSION=8.0
2024-11-29 07:47:54 -08:00
make
```
2025-03-22 19:35:31 +00:00
Пользовательские флаги компилятора могут быть переданы в cmake через переменную CFLAGS. Например:
2024-12-09 19:56:14 -05:00
```text
2025-03-14 14:54:00 -07:00
mkdir build
2024-12-09 19:56:14 -05:00
cd build
cmake .. -DCFLAGS="-O0 -Wno-unused-function"
make
```
2025-03-22 19:35:31 +00:00
#### Запуск всех Юнит-тестов:
2024-11-29 07:47:54 -08:00
```text
cd build
make -j unit
```
2025-03-22 19:35:31 +00:00
#### Запуск всех интеграционных тестов:
2024-11-29 07:47:54 -08:00
```text
make -j test
```
2025-03-22 19:35:31 +00:00
#### Запуск одного интеграционного теста:
2024-12-03 12:11:55 -05:00
```text
TEST_PATTERN=< test-function-or-file > make -j test
```
e.g.,
```text
TEST_PATTERN=test_sanity make -j test
TEST_PATTERN=test_rdb.py make -j test
```
2025-03-22 19:35:31 +00:00
## Загрузка модуля
Чтобы протестировать модуль с помощью Futriix, вы можете загрузить модуль любым из следующих способов:
2024-11-29 07:47:54 -08:00
2025-03-22 19:35:31 +00:00
#### С ипользованием файла конфигурации futriix.conf:
2024-11-29 07:47:54 -08:00
```
2025-03-22 19:35:31 +00:00
1. Добавьте следующее строки в файл конфигураии futriix.conf:
2024-11-29 07:47:54 -08:00
loadmodule /path/to/libjson.so
2025-03-22 19:35:31 +00:00
2. Запускаем futriix-сервер:
futriix-server /path/to/futriix.conf
2024-11-29 07:47:54 -08:00
```
2025-03-22 19:35:31 +00:00
#### Запуск Futriix с помощью опции --loadmodule option:
2024-11-29 07:47:54 -08:00
```text
2025-03-22 19:35:31 +00:00
futriix-server --loadmodule /path/to/libjson.so
2024-11-29 07:47:54 -08:00
```
2025-03-22 19:35:31 +00:00
#### Использование команды Futriix MODULE LOAD:
2024-11-29 07:47:54 -08:00
```
1. Connect to a running Valkey instance using valkey-cli
2. Execute Valkey command:
MODULE LOAD /path/to/libjson.so
```
2025-03-22 18:46:26 +00:00
2025-03-22 19:35:31 +00:00
## Использование
2025-03-22 19:58:55 +00:00
Первая команда JSON, которую следует попробовать, — это JSON. SET, который задает ключ Futriix с о значением JSON. JSON. SET принимает все типы значений JSON. В этом примере создается строка JSON:
2025-03-22 18:46:26 +00:00
```
> JSON.SET bike $ '"Hyperion"'
OK
> JSON.GET bike $
"[\"Hyperion\"]"
> JSON.TYPE bike $
1) "string"
```
2025-03-22 18:48:41 +00:00
2025-03-22 19:35:31 +00:00
Обратите внимание, что команды включают символ доллара $. Это путь к значению в документе JSON (в данном случае это просто корень). Вот еще несколько строковых операций. JSON. STRLEN сообщает вам длину строки, и вы можете добавить к ней еще одну строку с помощью JSON. STRAPPEND.
2025-03-22 18:46:26 +00:00
2025-03-22 18:56:19 +00:00
```
2025-03-22 18:46:26 +00:00
> JSON.STRLEN bike $
1) (integer) 8
> JSON.STRAPPEND bike $ '" (Enduro bikes)"'
1) (integer) 23
> JSON.GET bike $
"[\"Hyperion (Enduro bikes)\"]"
2025-03-22 18:56:19 +00:00
```
2025-03-22 18:46:26 +00:00
2025-03-22 19:35:31 +00:00
Числа можно увеличивать и умножать:
2025-03-22 18:46:26 +00:00
```
> JSON.SET crashes $ 0
OK
> JSON.NUMINCRBY crashes $ 1
"[1]"
> JSON.NUMINCRBY crashes $ 1.5
"[2.5]"
> JSON.NUMINCRBY crashes $ -0.75
"[1.75]"
> JSON.NUMMULTBY crashes $ 24
"[42]"
```
2025-03-22 19:35:31 +00:00
Вот более интересный пример, который включает массивы и объекты JSON:
2025-03-22 18:53:36 +00:00
2025-03-22 18:46:26 +00:00
```
> JSON.SET newbike $ '["Deimos", {"crashes": 0}, null]'
OK
> JSON.GET newbike $
"[[\"Deimos\",{\"crashes\":0},null]]"
> JSON.GET newbike $[1].crashes
"[0]"
> JSON.DEL newbike $[-1]
(integer) 1
> JSON.GET newbike $
"[[\"Deimos\",{\"crashes\":0}]]"
```
2025-03-22 18:50:26 +00:00
2025-03-22 19:35:31 +00:00
Команда JSON.DEL удаляет любое значение JSON которое вы указываете с помощью параметра path.
2025-03-22 18:46:26 +00:00
2025-03-22 19:35:31 +00:00
Вы можете манипулировать массивами с помощью выделенного подмножества команд JSON:
2025-03-22 18:46:26 +00:00
```
> JSON.SET riders $ []
OK
> JSON.ARRAPPEND riders $ '"Norem"'
1) (integer) 1
> JSON.GET riders $
"[[\"Norem\"]]"
> JSON.ARRINSERT riders $ 1 '"Prickett"' '"Royce"' '"Castilla"'
1) (integer) 4
> JSON.GET riders $
"[[\"Norem\",\"Prickett\",\"Royce\",\"Castilla\"]]"
> JSON.ARRTRIM riders $ 1 1
1) (integer) 1
> JSON.GET riders $
"[[\"Prickett\"]]"
> JSON.ARRPOP riders $
1) "\"Prickett\""
> JSON.ARRPOP riders $
1) (nil)
```
2025-03-22 19:35:31 +00:00
JSON объекты также имеют свои собственные команды:
2025-03-22 18:46:26 +00:00
```
> JSON.SET bike:1 $ '{"model": "Deimos", "brand": "Ergonom", "price": 4972}'
OK
> JSON.OBJLEN bike:1 $
1) (integer) 3
> JSON.OBJKEYS bike:1 $
1) 1) "model"
2) "brand"
3) "price"
```
2025-03-22 19:42:16 +00:00
## Ключи
2025-03-22 18:46:26 +00:00
```
2025-03-22 19:35:31 +00:00
$ futriix-cli --raw
2025-03-22 18:46:26 +00:00
> JSON.GET obj INDENT "\t" NEWLINE "\n" SPACE " " $
[
{
"name": "Leonard Cohen",
"lastSeen": 1478476800,
"loggedOut": true
}
]
```
2025-03-22 18:55:20 +00:00
2025-03-22 19:35:31 +00:00
## Ограничения
2025-03-22 19:02:55 +00:00
2025-03-22 19:41:06 +00:00
Значение JSON, передаваемое команде, может иметь глубину до 128. Если передать команде значение JSON, содержащее объект или массив с уровнем вложенности больше 128, команда вернет ошибку.
2025-03-22 19:02:55 +00:00
2025-03-22 18:55:20 +00:00
2025-03-22 19:40:15 +00:00
## Команды
2025-03-22 18:55:20 +00:00
```text
JSON.ARRAPPEND
JSON.ARRINDEX
JSON.ARRINSERT
JSON.ARRLEN
JSON.ARRPOP
JSON.ARRTRIM
JSON.CLEAR
JSON.DEBUG
JSON.DEL
JSON.FORGET
JSON.GET
JSON.MGET
JSON.MSET (#16 )
JSON.NUMINCRBY
JSON.NUMMULTBY
JSON.OBJLEN
JSON.OBJKEYS
JSON.RESP
JSON.SET
JSON.STRAPPEND
JSON.STRLEN
JSON.TOGGLE
JSON.TYPE
```