Запрос 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.

Для получения дополнительной информации читайте официальную документацию, в ней подробно описаны возможности системы.

Другие вопросы по тегам