Подтвердить что ты не робот

Redis performance, хранить json-объект как строку

Мне нужно сохранить модель User, например:

{ "nickname": "alan",
  "email": ...,
  "password":...,
  ...} // and a couple of other fields

Сегодня я использую Set: users
В этом наборе у меня есть член как пользователь: alan
В этом элементе у меня есть хэш выше

Это прекрасно работает, но мне просто интересно, не стоит ли вместо этого использовать следующий подход:

По-прежнему используйте пользователей Set (чтобы легко получить список пользователей (пользователей))
В этом наборе используйте только хранилище ключей/значений, например:

: alan value: строка версии выше пользовательского хеша

Извлечение записи было бы легче (тогда мне придется проанализировать его с помощью JSON).

Я очень новичок в redis, и я не уверен, что может быть лучшим. Как вы думаете?

4b9b3361

Ответ 1

Вы можете использовать структуру данных Redis hashes для хранения полей и значений объекта JSON. Например, ваш "пользовательский" набор все равно может использоваться как список, в котором хранятся все пользователи, и ваш индивидуальный объект JSON может быть сохранен в хеш, например:

db.hmset("user:id", JSON.stringify(jsonObj));

Теперь вы можете получить ключ всеми пользователями или только конкретный (из которого вы получаете/устанавливаете только указанные поля/значения). Также эти два вопроса, вероятно, связаны с вашим сценарием.

EDIT: (извините, я не понимал, что мы говорили об этом раньше)

Извлечение записи было бы легче (тогда мне придется проанализировать его с помощью JSON).

Это верно, но с хэш-структурой данных вы можете получить/установить только поле/значение, с которым вам нужно работать. Извлечение всего объекта JSON может привести к снижению производительности (зависит от того, как часто вы это делаете), если вы хотите только изменить часть объекта (другое дело, что вам нужно будет каждый раз подтягивать/разбирать объект).

Ответ 2

Еще одно достоинство JSON над хэшами - сохранение типа. 123.3 становится строкой "123.3" и в зависимости от библиотеки Null/None может быть случайно выбрано значение "null".

Оба являются немного утомительными, поскольку для этого потребуется написать трансформатор для извлечения строк и преобразования их обратно в ожидаемые типы.

В соображениях потребления пространства/памяти я начал склоняться к сохранению только значений в виде списка JSON ["my_type_version", 123.5, null , ... ], поэтому у меня не было накладных расходов на N * ( sum(len(concat(JSON key names))), что в моем случае было + 60% от используемой памяти Redis след.

Ответ 3

помните: хэши не могут хранить вложенные объекты, JSON может это сделать.

Ответ 4

Искренне, в любом случае работает отлично. То, как вы его храните, - это дизайнерское решение, которое вам нужно будет сделать. Это зависит от того, как вы хотите получить информацию о пользователе и т.д.

С точки зрения производительности, сохранение JSON-кодированной версии пользовательского объекта будет использовать меньше памяти и займет меньше времени для хранения/извлечения. То есть, разбор JSON, вероятно, быстрее, чем извлечение каждого поля из Redis. И даже если это не так, это, вероятно, более эффективно. Разница в производительности, вероятно, минимальная.