2013-09-22 9 views
5

最近nodejsのmemcachedからredisに切り替えました。私がnode-memcachedで好きだったのは、私がJavaScriptのオブジェクト全体をメモリに保存できるということでした。悲しいことに私はレディスでこれを行うことができませんでした。私は何ができる3rd-Eden/node-memcachedredisで入れ子になったjavascriptオブジェクトを保存する - NodeJS

var obj = { 
    name: "Hello world!", 
    author: "admin", 
    user: { 
     "yolololo" : { 
      "id": "352asdsafaseww", 
      "server": 5, 
      "data" : { 
        x: 1, 
        y: 1, 
        z: 50 
      } 
     }, 
     "yolol" : { 
      "id": "358dsa", 
      "server": 7 
     } 
    } 
} 

memcached.set("obj", obj, 12345, function(err) { }); 

、その後

memcached.get("obj", function(err, data) { 
    console.log(data); 
}); 

そして私は私が保存されたオブジェクトを取得します、例えば、私は、以下の目的を持ってそれはまさにその通りです。

redisclient.set("obj", obj, redis.print); 

私は

redisclient.get("obj", function(err, data) { 
    console.log(data); 
}); 

で値を取得すると、出力は[object Object]を含む単なる文字列です:

のRedisの問題は、私はこのようなオブジェクトを保存した場合ということです。

私はredisがテキストベースのプロトコルであり、obj.toString()を実行しようとしていますが、memcachedはオブジェクトの世話をしているように見えます。 私はちょうど何ができると思った:JSON obj->文字列の場合はI/Oと私はわからないだろう

redisClient.set("obj", JSON.stringify(obj)); 

が、非常識なハイが存在しますので、私は、これは良いことかどうか分かりませんボトルネックになる(10k +要求/秒)。

MemcachedとRedisの両方がデータを文字列として保存しますが、オブジェクトを変換するための組み込み機能がありますか?すべて

+0

if (Buffer.isBuffer(value)) { flag = FLAG_BINARY; value = value.toString('binary'); } else if (valuetype === 'number') { flag = FLAG_NUMERIC; value = value.toString(); } else if (valuetype !== 'string') { flag = FLAG_JSON; value = JSON.stringify(value); } 

また、取得したテキストthis wayを解析します。 ** node-memcached **は自動的にシリアル化処理を行います。 – fardjad

+0

@ fardjadはい、そうですが、Redisはそのような組み込みプロセスを持っていますか、それとも手動で変換する必要がありますか? – Deepsy

答えて

10

まずのみdata types次サポートしています。設定

  • ハッシュ
  • ソートセット

    1. 文字列
    2. 一覧

    あなたが保存する必要があります文字列としてのオブジェクトredisおよびの両方。

    node-memcachedは自動的にデータを解析/文字列化します。しかし、node-redisはありません。

    ただし、独自のシリアル化/デシリアライズ機能を実装できます。

    ノード-memcachedを stringifiesオブジェクトの方法はas followsです:私は、文字列として** memcachedの**のデータを格納すると思う

    switch (flag) { 
        case FLAG_JSON: 
         dataSet = JSON.parse(dataSet); 
         break; 
        case FLAG_NUMERIC: 
         dataSet = +dataSet; 
         break; 
        case FLAG_BINARY: 
         tmp = new Buffer(dataSet.length); 
         tmp.write(dataSet, 0, 'binary'); 
         dataSet = tmp; 
         break; 
    }