Redis performance, хранить json-объект как строку
Мне нужно сохранить модель User, например:
{ "nickname": "alan",
"email": ...,
"password":...,
...} // and a couple of other fields
Сегодня я использую Set: users
В этом наборе у меня есть член как пользователь: alan
В этом элементе у меня есть хэш выше
Это прекрасно работает, но мне просто интересно, не стоит ли вместо этого использовать следующий подход:
По-прежнему используйте пользователей Set (чтобы легко получить список пользователей (пользователей))
В этом наборе используйте только хранилище ключей/значений, например:
: alan
value: строка версии выше пользовательского хеша
Извлечение записи было бы легче (тогда мне придется проанализировать его с помощью JSON).
Я очень новичок в redis, и я не уверен, что может быть лучшим. Как вы думаете?
Ответы
Ответ 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. И даже если это не так, это, вероятно, более эффективно. Разница в производительности, вероятно, минимальная.