node.js以redis格式存储对象

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)

转换回对象.

  • 现在这是一个答案!你不能做某件事从来都不是答案.tnx Shawn. (12认同)
  • 它是否适用于_sockets_?你可以在另一台机器(甚至是同一台机器)上反序列化套接字并开始,比如将数据推入其中吗? (3认同)

Ser*_*sev 38

Downvoters:这里的上下文是SET命令和存储任意对象的能力.

不,你做不到.您应该接受Redis将所有内容存储为字符串的事实(该协议毕竟是基于文本的).Redis可以执行一些优化并将一些值转换为整数,但这是它的业务,而不是你的业务.

如果要在Redis中存储任意对象,请确保在检索之后对其进行序列化,然后再进行保存和反序列化.

不过,我不确定你是否可以使用套接字对象.毕竟它们只是描述了一个系统资源(一个开放的连接)(例如TCP套接字).如果您设法序列化描述并在另一台计算机上反序列化,则该另一台计算机将不具有该连接.

  • 不确定它是如何回到2012年的,但至少现在在2016年Redis**确实**存储了任意对象,它确实**不会将所有内容存储为字符串.您只需使用不同的命令/方法即可使用该功能.请参阅Jason Loveman的答案以获得更好的解决方案:http://stackoverflow.com/a/21490063/130691 (3认同)
  • @JMTyler:对于初学者来说,显然"作为一个字符串的一切"部分是在SET命令的上下文中.接下来,redis hash不是JS对象的等价物,甚至不是关闭的.在redis中存储_arbitrary_事物的唯一方法是序列化和"设置"它(假设有问题的东西当然可以序列化/反序列化). (3认同)
  • @JMTyler:指向文档的链接?Redis不存储__arbitrary__对象.只是一些预先确定的类型(字符串,哈希,列表等).如果你通过`SET`命令存储一些东西,它将被存储为一个字符串.没办法解决这个问题. (2认同)

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)

  • 检索:`client.hgetall("the-key-name",function(err,obj){// ...})`,用于`hmget`需要`字段名称`. (5认同)
  • 遗憾的是,在使用 `hgetall` 时,`a` 和 `b` 将作为字符串返回,这使得这更加尴尬。 (3认同)
  • @JMTyler:这对于存储任意js对象(在这种情况下是套接字)没有帮助. (2认同)
  • @JMTyler:祝你好运反序列化成可用的形式:) (2认同)

小智 7

我还发现这是一个非常有用的工具,特别是如果你将JSON从API引导到你的前端:

节点redis的-jsonify

如果您收到一个巨大的JSON块而无法存储为特定的哈希值,那么在存储时对其进行字符串化将允许您检索整个json而不仅仅是"[object Object]".