Запрос json с помощью RedisJSON
У меня есть список пользователей в формате json, который я хочу отобразить в виде таблицы для пользователя-администратора в пользовательском интерфейсе. Я хочу хранить всех пользователей, которых я переустанавливаю, и я думаю, что именно так я бы хранил
JSON.SET user $ '{"id":"1","user_id":"1","one": "1","two": "2","three": "3","rank_score": 1.44444}' EX 60
JSON.SET user $ '{"id":"2","user_id":"2","one": "2","two": "2","three": "3","rank_score": 2.44444}'
JSON.SET user $ '{"id":"3","user_id":"3","one": "3","two": "3","three": "3","rank_score": 3.44444}'
JSON.SET user $ '{"id":"4","user_id":"4","one": "4","two": "4","three": "4","rank_score": 4.44444}'
и позже получить все записиuser
эта командаJSON.GET user $
возвращает только 4-ю запись.
Команда multi все же дала мне одну запись
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> json.get user
QUEUED
127.0.0.1:6379(TX)> exec
1) "{\"id\":\"4\",\"user_id\":\"4\",\"one\":\"4\",\"two\":\"4\",\"three\":\"4\",\"rank_score\":4.44444}"
Я хотел бы:
> Get all
> Get all records where id is a given id
> Get all records order by rank_score desc
> Remove record where id is 2
Как мне сгруппировать всех моих пользователей, чтобы я мог получить их всех сразу?
Редактировать:
Я сделал список пользователей, чтобы вложить все в
JSON.SET user $ '{"users_list":[{"id":"1","user_id":"1","one": "1","two": "1","three": "1","rank_score": 1.44444},{"id":"2","user_id":"2","one": "2","two": "2","three": "2","rank_score": 2.44444},{"id":"3","user_id":"3","one": "3","two": "3","three": "3","rank_score": 3.44444},{"id":"4","user_id":"4","one": "4","two": "4","three": "4","rank_score": 4.44444}]}'
Удобочитаемый
JSON.SET user $ '{
"users_list":[
{
"id":"1",
"user_id":"1",
"one": "1",
"two": "1",
"three": "1",
"rank_score": 1.44444
},
{
"id":"2",
"user_id":"2",
"one": "2",
"two": "2",
"three": "2",
"rank_score": 2.44444
},
{
"id":"3",
"user_id":"3",
"one": "3",
"two": "3",
"three": "3",
"rank_score": 3.44444
},
{
"id":"4",
"user_id":"4",
"one": "4",
"two": "4",
"three": "4",
"rank_score": 4.44444
}
]
}'
Приведет ли более 128 пользователей к ошибке?
1 ответ
RedisJSON по-прежнему является хранилищем ключей и значений по своей сути. Существует только одно значение с данным ключом. Когда вы звонитеJSON.SET
с тем же путем в существующем ключе снова, любые предоставленные значения переопределяют те, которые были там раньше. Так зоветJSON.SET user $ ...
перезаписывает ключи.
Вместо использования ключа стандартной практикой является использованиеuser
в качестве префикса, сохраняя ключи с именами вродеuser:1
,user:2
и т. д. Это предпочтительнее по нескольким причинам (более производительно, чем хранение одного массива документов JSON, может определять правила ACL для определенных шаблонов клавиш и т. д.), но самое главное для вашего вопроса:
Вы можете использовать полнотекстовый поиск RediSearch, используяFT.SEARCH
команда для получения ключей, соответствующих любой необходимой комбинации параметров. Например, все пользователи, у которых есть определенный . Он также позволяет сортировать. Например, если вы храните таких пользователей, как
JSON.SET user:1 $ '{"id":"1","user_id":"1","one": "1","two": "2","three": "3","rank_score": 1.44444}' EX 60
JSON.SET user:2 $ '{"id":"2","user_id":"2","one": "2","two": "2","three": "3","rank_score": 2.44444}'
Вы можете создать индекс, используяFT.CREATE
для любых параметров, которые должны быть доступны для поиска, например, для индексации их s и s, команда FT.CREATE userSearch ON JSON PREFIX 1 user: SCHEMA id NUMERIC rank_score NUMERIC SORTABLE
. Чтобы объяснить подробно, это говорит: создайте поисковый индекс с именемuserSearch
, для ключей типа JSON, для всех ключей с одним префиксомuser:
, со следующими полями: является числом и является сортируемым числом.
Вот как вы упомянули:
- Получить все (я предполагаю, что вы имеете в виду всех пользователей):
keys user:*
- Получить все записи, где
id
заданный идентификатор (давайте ищем идентификатор 9000):FT.SEARCH userSearch "@id:9000"
- Получить все записи в порядке
rank_score
описание:FT.SEARCH userSearch "@rank_score:*" SORTBY rank_score DESC
- Удалить запись с идентификатором 2 (я предполагаю, что вы имеете в виду все записи): сначала
FT.SEARCH userSearch "@id:2"
, то для каждого из результатовJSON.DEL key
.
Для получения дополнительной информации читайте официальную документацию, в ней подробно описаны возможности системы.