8

最近、nodejs で memcached から redis に切り替えました。node-memcached で気に入った点は、javascript オブジェクト全体をメモリに保存できることです。残念ながら、これを redis で行うことはできませんでした。たとえば、次のオブジェクトを取得しました。

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
        }
    }
}

3rd-Eden/node-memcachedを使用すると、次のことができます。

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

その後

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

そして、保存したオブジェクトをそのまま取得します。

redis の問題は、次のようにオブジェクトを保存した場合です。

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

で値を取得すると

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

出力は、 を含む単なる文字列です[object Object]

ええ、私はredisがテキストベースのプロトコルであり、obj.toString()を実行しようとしていることを理解していますが、memcachedはオブジェクトを処理し、redisは処理しないようです。私はただできると思った:

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

しかし、非常に高い I/O が発生し、JSON obj->string がボトルネック (10k+ リクエスト/秒) になるかどうかわからないため、これが良いかどうかはわかりません。

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

4

1 に答える 1

14

まず、データ型のみをサポートします。

  1. リスト
  2. 設定
  3. ハッシュ
  4. ソート済みセット

redisの両方にオブ​​ジェクトを文字列として保存する必要があります。

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

ただし、アプリに独自のシリアル化/逆シリアル化関数を実装できます。

node-memcachedがオブジェクトを文字列化する方法は次のとおりです。

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

また、取得したテキストを次のように解析します。

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;
}
于 2013-09-22T09:26:16.130 に答える