节点redis zadd键错误

时间:2014-02-18 17:10:27

标签: node.js redis node-redis

我尝试使用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;
});

这段代码有什么问题吗?

顺便说一下:我尝试完成的是通知/收件箱系统......所以最好不要再向我询问,因为你会帮助,最后你不会:(

错误:针对持有错误值的键的ERR操作

1 个答案:

答案 0 :(得分:2)

我会说密钥已经存在于Redis中并且不是有序集。尝试查看Redis中是否已经有usr :: ID :: msgs条目,并检查它们的类型。

<强>更新

如果只保留一个有序集,则无法更新条目,因为条目数据已序列化并用作已排序集项的值。

你有几个解决方案:

1)您可以读取和删除项目,反序列化,更改读取状态,再次序列化,再次在已排序的集合中添加项目。如果需要,可以使用服务器端Lua脚本进行一次往返。

2)您可以将数据模型拆分为多个对象:保留一个关联时间戳和消息ID的有序集,并使用每个消息ID一个哈希对象来存储每个消息的属性。因此,更新消息的读取状态很容易(HMSET)。

3)你也可以有两个有序集(一个用于读取消息,一个用于未读消息)。更改消息的状态将涉及从一个集合中删除该项目,并将其添加到另一个集合中。

解决方案的最佳选择可能取决于您的数据访问模式。