web-dev-qa-db-ja.com

node.jsはredisにオブジェクトを保存します

ここにあります-ネイティブJS(node.js)オブジェクト(フラッシュソケット参照)を特定のキーの下のredisに保存したいです。単純な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
    });
  },
45
Pono

ダウンボッター:ここでのコンテキストは、SETコマンドと任意のオブジェクトを保存する機能です

いいえ、できません。 Redisはすべてを文字列として保存するという事実を受け入れる必要があります(結局のところ、プロトコルはテキストベースです)。 Redisは、いくつかの最適化を実行し、一部の値を整数に変換する場合がありますが、それはビジネスであり、あなたのものではありません。

Redisにarbitraryオブジェクトを保存する場合は、保存する前にそれらをシリアライズし、取得後にデシリアライズしてください。

ただし、ソケットオブジェクトを使用してそれを実行できるかどうかはわかりません。それらは単にシステムリソース(開いている接続)を記述するだけです(たとえば、TCPソケット)。説明をシリアライズして別のマシンでデシリアライズすると、他のマシンは接続できなくなります。

33

ソケットはObject型であるため、保存する前にオブジェクトを文字列に変換する必要があります。ソケットを取得するときは、オブジェクトに戻す必要があります。

使用できます

JSON.stringify(socket) 

文字列に変換し、

JSON.parse(socketstr) 

オブジェクトに変換します。

編集:

バージョン2.0.0、オブジェクトをハッシュとしてRedisに保存できます。

client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234");

client.hgetall("hosts", function (err, obj) {
    console.dir(obj);
});

https://redis.io/commands/hset

https://github.com/NodeRedis/node_redis

117
Shawn Janas

以下のソリューションは、redisを使用することのすべてのポイントを解決するものではありません。クラスターインスタンス間でデータを共有するためです。インスタンス固有のIDをredisに保存しても、その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'}});
32
Jason Loveman

また、特にJSONをAPIからフロントエンドにチャネリングしている場合、これは非常に便利なツールであることがわかりました。

node-redis-jsonify

JSONの巨大なブロックを受け取り、特定のハッシュとして保存できない場合、保存中に文字列化すると、「[オブジェクトオブジェクト]」の代わりにjson全体を取得できます。

6
Zoombear

ストレージobject.toString()が呼び出される前にオブジェクトを内部的に保存すると、それが保存される値であると信じています。

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

あなたがする必要があるのは、JSON.encodeとJSON.parseを使用することです。

(隠しファイル、バイナリ)参照を保存することはできません。
それ以外の場合は、整数とソケットを対応させ、整数を保存できる場合があります。

3
clyfe