node.js - Node redis zadd键错误

标签 node.js redis node-redis

我尝试使用 redis 排序集命令 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;
});

这段代码有什么问题吗?

顺便说一句:我试图完成的是通知/收件箱系统...所以最好不要像你会帮忙但最后你不会那样问我来节省时间:(

错误:针对包含错误类型值的键的错误操作

最佳答案

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

更新:

如果只保留一个有序集合,则实际上不可能更新条目,因为条目数据已序列化并用作已排序集合项的值。

虽然你有几个解决方案:

1) 您可以读取和删除项目、反序列化、更改读取状态、再次序列化、再次将项目添加到排序集中。如果需要,可以使用服务器端 Lua 脚本来一次往返完成。

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

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

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

关于node.js - Node redis zadd键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21860660/

相关文章:

node.js - pm2 --watch 每隔 3 秒记录一次,与配置文件无关

node.js - 如何在亚马逊 s3 上删除文件图像

node.js - 在nodejs回溯中获取完全限定的路径?

mongodb - redis vs mongodb - 从主服务器复制到运行内存数据库的从服务器

mongodb - 解决 Overembedding MongoDB with Slow Down performance

javascript - 处理异步 Node redis 函数,同时在两个键上使用 INCR 很尴尬

javascript - Mongoose 对象关系

node.js - Redis time() 有时会返回 future 的时间

python - python原生数据结构 "DICTIONARY"和 "Redis"数据库有什么区别?

javascript - 如何将大流转换为 gzipped base64 字符串