Pon*_*ono 47 object redis node.js
这是事情 - 我想在redis下的某个键下存储本机JS(node.js)对象(flash套接字引用).当我这么做时,client.set()它被存储为一个字符串.当我试图获得价值时,我得到[object Object]- 只是一个字符串.
有机会让这个工作吗?这是我的代码:
addSocket : function(sid, socket) {
client.set(sid, socket);
},
getSocket : function(sid) {
client.get(sid, function(err, reply) {
// cant't get an object here. All I get is useless string
});
},
Run Code Online (Sandbox Code Playgroud)
Sha*_*nas 122
由于套接字是类型的Object,您需要在存储之前将对象转换为字符串,并且在检索套接字时,需要将其转换回对象.
您可以使用
JSON.stringify(socket)
Run Code Online (Sandbox Code Playgroud)
转换为字符串和
JSON.parse(socketstr)
Run Code Online (Sandbox Code Playgroud)
转换回对象.
Ser*_*sev 38
Downvoters:这里的上下文是SET命令和存储任意对象的能力.
不,你做不到.您应该接受Redis将所有内容存储为字符串的事实(该协议毕竟是基于文本的).Redis可以执行一些优化并将一些值转换为整数,但这是它的业务,而不是你的业务.
如果要在Redis中存储任意对象,请确保在检索之后对其进行序列化,然后再进行保存和反序列化.
不过,我不确定你是否可以使用套接字对象.毕竟它们只是描述了一个系统资源(一个开放的连接)(例如TCP套接字).如果您设法序列化描述并在另一台计算机上反序列化,则该另一台计算机将不具有该连接.
Jas*_*man 32
下面的解决方案并没有解决使用redis的全部问题 - 跨群集实例共享数据.在redis中存储特定于实例的id对于尝试使用该id的另一个实例将毫无意义.
但是,可以使用对象调用"hmset",它会将每个对象字段设置为同一个键中的单独redis字段.当你调用hgetall时,它将被转换回一个对象.不幸的是,我不认为它处理对象中的嵌套对象或数组,只有简单的属性,其值可以通过"toString()"存储.
所以像一个对象
client.hmset("myhashkey",{a:1, b:2, c:'xxx'})
Run Code Online (Sandbox Code Playgroud)
效果很好,可以用
client.hmget("myhashkey", function(obj) {
console.log(obj);
});
Run Code Online (Sandbox Code Playgroud)
不是很多:
client.hmset("myhashkeynested",{a:1, b:2, c:'xxx', d: { d1: 'x', d2: 'y'}});
Run Code Online (Sandbox Code Playgroud)
小智 7
我还发现这是一个非常有用的工具,特别是如果你将JSON从API引导到你的前端:
如果您收到一个巨大的JSON块而无法存储为特定的哈希值,那么在存储时对其进行字符串化将允许您检索整个json而不仅仅是"[object Object]".
| 归档时间: |
|
| 查看次数: |
50049 次 |
| 最近记录: |