node.js将对象存储在redis中

这是事情 – 我想存储本地JS(node.js)对象(闪存套接字引用)在redis下的某个关键。 当我用简单的client.set()来做这件事的时候,它被存储为一个string。 当我尝试获取值时,我得到[object Object] – 只是一个string。

有机会得到这个工作? 这是我的代码:

  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 }); }, 

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

不,你不能这样做。 您应该接受Redis以stringforms存储所有内容(毕竟协议是基于文本的)。 Redis可能会执行一些优化并将一些值转换为整数,但这是他的业务,而不是你的业务。

如果要在Redis中存储任意对象,请确保在保存之前序列化它们,并在检索之后反序列化。

不过,我不确定你是否可以用socket对象来做到这一点。

由于套接字是“Object”types的,因此需要在存储之前将对象转换为string,并且在检索套接字时需要将其转换回对象。 您可以使用

 JSON.stringify(socket) 

转换为一个string和

 JSON.parse(socketstr) 

转换回一个对象。

下面的解决scheme并没有解决使用redis的全部要点 – 跨群集实例共享数据。 在redis中存储一个特定于实例的id对另一个试图使用这个id的实例是没有意义的。

但是,有一个“hmset”可以用一个对象调用,它将每个对象字段设置为一个单独的redis字段在同一个键。 当您调用hgetall时,它将被转换回一个对象。 不幸的是,我不认为它处理对象内的嵌套对象或数组,只有简单的属性,其值可以通过“toString()”存储。

所以像一个对象

 client.hmset("myhashkey",{a:1, b:2, c:'xxx'}) 

伟大的作品,可以检索与

 client.hmget("myhashkey", function(obj) { console.log(obj); }); 

不是那么多:

 client.hmset("myhashkeynested",{a:1, b:2, c:'xxx', d: { d1: 'x', d2: 'y'}}); 

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

节点redis的-jsonify

如果您收到一个巨大的JSON块,并且不能存储为特定的散列,则在存储时对其进行string化将允许您检索整个json,而不仅仅是“[object Object]”。

我相信,当你存储的对象,内部之前存储object.toString()被调用,这是存储的值。

 ({a: 1}).toString() # "[object Object]" 

你需要做的是使用JSON.encode和JSON.parse。

您不能存储(隐藏,二进制)引用。
否则,你可能能够在整数和套接字之间进行对应,并存储整数。

您可以使用像这样的技术保存对JavaScript对象的引用。 基本上,它扩展了Object.prototype(不必),你可以调用radd()来添加一个自定义的引用到rhash {},然后用rget()检索对象。 “参考”是一个string,所以它适合Redis。 这意味着你不需要使用.stringify()和.parse()来在数据库中放置/获取一个副本。 然而,当Nodeclosures时,对象的数据将被销毁,除非它的序列化。

 var OBJECT = Object.prototype; OBJECT.rhash = {}; OBJECT.rset = function(id, object) { OBJECT.rhash[id] = object; return id; }; OBJECT.rget = function(id) { return OBJECT.rhash[id]; }; var dog = { name: "Skippy", food: "Bacon", bark: function() { alert(this.name + "!"); } }; var id = OBJECT.rset("a123", dog); var ref = OBJECT.rget("a123"); ref.bark(); 

以及如果你想想javascript对象是谁的价值观可能引用其他对象,并在套接字可能本机对象的情况下。 所以如果redis是执行javascript的外部,它将如何能够存储对该对象的引用?

 // a and b exist inside the executing javascript, not in the external O/S a = {} b = {} var obj = { 'one': a, 'two': b } // how can redis possibly store references to obj, a or b when this application exits? redis.set('obj', obj) // same as.. redis.set('obj', obj.toString()) /*or*/ redis.set('obj', "" + obj) // same as.. redis.set('obj', "[object Object]") // the trick is to stringify the object redis.set('obj', JSON.stringify(obj)) // same as.. redis.set('obj', "{'one':{},'two':{}}") // here redis does not have to store the actual object references but rather a json string representing the object // this could also work redis.set('obj', "{'one':a,'two':b}") // where you would then do: obj = eval(redis.get('obj')) // provided that a and b have already been initialized