我尝试使用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操作
答案 0 :(得分:2)
我会说密钥已经存在于Redis中并且不是有序集。尝试查看Redis中是否已经有usr :: ID :: msgs条目,并检查它们的类型。
<强>更新强>
如果只保留一个有序集,则无法更新条目,因为条目数据已序列化并用作已排序集项的值。
你有几个解决方案:
1)您可以读取和删除项目,反序列化,更改读取状态,再次序列化,再次在已排序的集合中添加项目。如果需要,可以使用服务器端Lua脚本进行一次往返。
2)您可以将数据模型拆分为多个对象:保留一个关联时间戳和消息ID的有序集,并使用每个消息ID一个哈希对象来存储每个消息的属性。因此,更新消息的读取状态很容易(HMSET)。
3)你也可以有两个有序集(一个用于读取消息,一个用于未读消息)。更改消息的状态将涉及从一个集合中删除该项目,并将其添加到另一个集合中。
解决方案的最佳选择可能取决于您的数据访问模式。