futriix-json/README.md

266 lines
8.6 KiB
Markdown
Raw Normal View History

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-разрядных машин.
2025-03-22 19:35:31 +00:00
## Компиляция
2025-03-22 19:35:31 +00:00
#### Компиляция модуля и запуск тестов
```text
2025-03-22 19:35:31 +00:00
# Компилирет futriix-server (нестабильную-ветку) и запускает интеграционные тесты
./build.sh
```
2025-03-22 19:35:31 +00:00
По умолчанию версия futriix является "нестабильной". Для того чтобы изменить ветку выполните команду:
```text
2025-03-22 19:35:31 +00:00
# Компилирет futriix-server () и запускает интеграционные тесты
SERVER_VERSION=8.0 ./build.sh
```
2025-03-22 19:35:31 +00:00
Пользовательские флаги компилятора могут быть переданы в скрипт сборки через переменную окружения CFLAGS. Например:
```text
CFLAGS="-O0 -Wno-unused-function" ./build.sh
```
2025-03-22 19:59:32 +00:00
#### Сборка модуля с помощью [ASAN](https://github.com/google/sanitizers/wiki/AddressSanitizer)
```text
export ASAN_BUILD=true
./build.sh
```
2025-03-22 19:35:31 +00:00
#### Чтобы собрать только модуль
```text
mkdir build
cd build
cmake ..
make
```
2025-03-22 19:35:31 +00:00
Версия futriix по умолчанию — «нестабильная». Чтобы переопределить его, выполните следующие действия:
```text
mkdir build
cd build
cmake .. -DVALKEY_VERSION=8.0
make
```
2025-03-22 19:35:31 +00:00
Пользовательские флаги компилятора могут быть переданы в cmake через переменную CFLAGS. Например:
```text
mkdir build
cd build
cmake .. -DCFLAGS="-O0 -Wno-unused-function"
make
```
2025-03-22 19:35:31 +00:00
#### Запуск всех Юнит-тестов:
```text
cd build
make -j unit
```
2025-03-22 19:35:31 +00:00
#### Запуск всех интеграционных тестов:
```text
make -j test
```
2025-03-22 19:35:31 +00: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, вы можете загрузить модуль любым из следующих способов:
2025-03-22 19:35:31 +00:00
#### С ипользованием файла конфигурации futriix.conf:
```
2025-03-22 19:35:31 +00:00
1. Добавьте следующее строки в файл конфигураии futriix.conf:
loadmodule /path/to/libjson.so
2025-03-22 19:35:31 +00:00
2. Запускаем futriix-сервер:
futriix-server /path/to/futriix.conf
```
2025-03-22 19:35:31 +00:00
#### Запуск Futriix с помощью опции --loadmodule option:
```text
2025-03-22 19:35:31 +00:00
futriix-server --loadmodule /path/to/libjson.so
```
2025-03-22 19:35:31 +00:00
#### Использование команды Futriix MODULE LOAD:
```
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
```