производительность Redis, сохранить объект JSON в виде строки - PullRequest
22 голосов
/ 20 апреля 2011

Мне нужно сохранить модель пользователя, что-то вроде:

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

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

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

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

ключ: значение alan: строковая версия хеша указанного пользователя

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

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

Ответы [ 4 ]

20 голосов
/ 20 апреля 2011

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

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

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

РЕДАКТИРОВАТЬ: (извините, я не понял, что мы говорили об этом ранее)

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

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

7 голосов
/ 09 сентября 2013

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

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

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

4 голосов
/ 19 февраля 2014

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

2 голосов
/ 21 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...