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