【问题标题】:node redis zadd key error节点redis zadd键错误
【发布时间】:2014-02-18 17:10:26
【问题描述】:

我尝试使用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 对持有错误值的键的操作

【问题讨论】:

    标签: node.js redis node-redis


    【解决方案1】:

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

    更新:

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

    不过,您有几种解决方案:

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

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

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

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

    【讨论】:

    • 感谢您的回答。你说得对,我最近将我的代码从列表更改为排序集。但是由于我找不到更新字段的方法,所以我选择了这种方法。
    • 请给我一个建议,告诉我如何使用排序集将notification.read上的读取状态从未读(0)更新为已读(1)
    • 非常感谢,我选择了选项 1/。选择 3/ 也很好,因为我想通知用户他有未读消息。选项 2/ 似乎也很有趣,我会全部尝试一下,看看效果
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2015-06-17
    相关资源
    最近更新 更多