2017-05-05 20 views
1

Redisで文字列データを含むバッファデータを一緒に保存する可能性はありますか?Redisで圧縮(バッファ)データを含む文字列データを保存する

擬似コード:

// Data compression 
var user = { name: "Xyz" } 
var userString = JSON.stringify(user) 
var userBuffer = new Buffer(userString, "utf8") 
var compressed = zlib.gzip(userBuffer) 
// Adding data onto Redis 
var data = { id: 1, compressed: compressed } 
var dataString = JSON.stringify(data) 
redis.set("test", dataString) 

それは不可能だが、私がお願いしたいです。

文字列を含む圧縮データを一緒に格納する機会はありますか?

編集:

同じキーで非圧縮データと圧縮データを記憶した後、私は、上記ユーザデータを解凍することができません。

擬似コード:

var dataString = redis.get("test") 
var data = JSON.parse(dataString) 
console.log(data) 
// writes { id:1, compressed: { type: Buffer, data: [31, 139, 8...] } } 

var compressed = data.compressed 
var user = zlib.gunzip(compressed) 
// user would be undefined here 
+0

あなたがここで何を求めているかはあまり明確ではありません。圧縮された*と*圧縮されていないデータを同じキーに入れたいと言っていますか?どのような文字列を参照していますか? – captncraig

+0

うまくいかなければなりません - あなたはどんな擬似エラーを得ていますか? –

+0

@OliviaRuthは実際にはいです。圧縮されたデータと圧縮されていないデータを同じキーに格納したい。 – efkan

答えて

3
const zlib  = require('zlib'); 
const redis = require('redis').createClient(); 
var user  = { name: "Xyz" } 
var userString = JSON.stringify(user) 
var userBuffer = new Buffer(userString, "utf8") 
var compressed = zlib.gzipSync(userBuffer) 
var data  = { id: 1, compressed: compressed } 
var dataString = JSON.stringify(data) 

console.log('Compressed', dataString); 
redis.set('mykey', dataString, err => { 
    if (err) throw err; 
    redis.get('mykey', (err, dataString) => { 
    if (err) throw err; 

    var data   = JSON.parse(dataString) 
    var buffer  = Buffer.from(data.compressed); 
    var uncompressed = zlib.gunzipSync(buffer); 

    console.log('Uncompressed', JSON.parse(uncompressed)); 
    redis.end(false); 
    }) 
}); 

キー(Buffer.from()を使用して)、それを解凍する前に、適切なインスタンスにバックバッファの文字列表現を変換することです。

しかし、BufferのJSON表現はそれほど簡潔ではないので、データをRedisに格納する別の方法(バッファをストリングする必要がないもの)を検討する必要があります。おそらくa hashを使用しています。

+0

ありがとうございました!実際には、ソートされたセットに圧縮データを格納する必要があります。この静的なデータを圧縮して保存すると、クライアントに直接送信することができます(すべてのユーザーに毎回圧縮せずに)。また、CPUのコストと時間の複雑さを考慮すると有益です。 – efkan

+1

セットを使用している場合は、バッファが文字列ベースのオブジェクトとしてエンコードされないように、JSONを使用するのではなく、['msgpack'](https://www.npmjs.com/package/msgpack) 'msgpack'はJSONよりも遅いので、トレードオフは生の速度とストレージの要求です)。 ['protobufjs'](https://www.npmjs.com/package/protobufjs)もあります。 – robertklep

+0

もう一度ありがとうございます。私はそれらをチェックアウトします。 – efkan