ошибка ключа redis zadd узла

Я пытаюсь использовать команду redis sorted set zadd. Но сохраняя ошибку броска, когда я запускаю этот скрипт:

var ts = Math.round(Date.now() / 1000)
      , key = 'usr::' + dest.ID + '::msgs'
      , id = uuid.v1();
var notify = {
    msg: response.msg,
    from: response.from ? response.from : null,
    type: response.type ? response.type : null,
    date: ts,
    read: 0
}
client.zadd(key, ts, JSON.stringify(notify), function (err, response) {
    if (err) throw err;
});

Что-то не так с этим кодом?

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

ОШИБКА: ОШИБКА Операция с ключом, содержащим неверное значение


person Marcel Djaman    schedule 18.02.2014    source источник


Ответы (1)


Я бы сказал, что ключ уже существует в Redis и не является отсортированным набором. Попробуйте посмотреть, есть ли у вас записи usr::ID::msgs в Redis, и проверьте их тип.

Обновление:

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

Однако у вас есть несколько решений:

1) вы можете прочитать и удалить элемент, десериализовать, изменить статус чтения, снова сериализовать, снова добавить элемент в отсортированный набор. Это можно сделать за один круговой обход с помощью Lua-скрипта на стороне сервера, если это необходимо.

2) вы можете разделить свою модель данных на несколько объектов: сохранить один отсортированный набор, связанный с отметкой времени и идентификатором сообщения, и использовать один хэш-объект для каждого идентификатора сообщения для хранения свойств каждого сообщения. Таким образом, легко обновить статус чтения сообщения (HMSET).

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

Лучший выбор решения, вероятно, зависит от ваших шаблонов доступа к данным.

person Didier Spezia    schedule 18.02.2014
comment
Спасибо за ваш ответ. вы подчеркиваете, что я недавно изменил свой код со списка на отсортированный набор. Но так как я не мог найти способ сделать обновление поля, я выбрал этот подход. - person Marcel Djaman; 19.02.2014
comment
Можете, пожалуйста, дать мне совет о том, как обновить состояние чтения в файле notification.read с непрочитанного (0) на прочитанное (1), используя отсортированный набор - person Marcel Djaman; 19.02.2014
comment
Большое спасибо, я выбрал вариант 1/. Также выбор 3/ является хорошим моментом, так как я хочу уведомить пользователя о непрочитанных сообщениях, которые у него есть. Вариант 2/ тоже кажется интересным, я попробую их все и посмотрю производительность - person Marcel Djaman; 19.02.2014