sql >> データベース >  >> NoSQL >> Redis

javascriptでredisのすべてのキーと値を取得する方法は?

    まず第一に、あなたの質問の問題は、forの内部にあるということです ループ、client.get 非同期で呼び出されます 同期のコールバック for ループは非同期コールバックを待機しないため、次の行res.json({data:jobs}); forの直後に呼び出されます 非同期コールバックの前にループします。行の時点でres.json({data:jobs}); 呼び出されると、配列jobs まだ空です[] 応答とともに返されます。

    これを軽減するには、asyncなどのpromiseモジュールを使用する必要があります 、bluebirdES6 Promise など

    非同期モジュールを使用して変更されたコード

    app.get('/jobs', function (req, res) {
        var jobs = [];
        client.keys('*', function (err, keys) {
            if (err) return console.log(err);
            if(keys){
                async.map(keys, function(key, cb) {
                   client.get(key, function (error, value) {
                        if (error) return cb(error);
                        var job = {};
                        job['jobId']=key;
                        job['data']=value;
                        cb(null, job);
                    }); 
                }, function (error, results) {
                   if (error) return console.log(error);
                   console.log(results);
                   res.json({data:results});
                });
            }
        });
    });
    

    しかし、Redisから ドキュメントでは、キーの使用はデバッグと、キースペースレイアウトの変更などの特別な操作を目的としており、本番環境にはお勧めできません。

    したがって、SCANを使用するredisscanという別のモジュールを以下のように使用することをお勧めします。 KEYSの代わりに Redisで提案されているように ドキュメント。

    のようなもの

    var redisScan = require('redisscan');
    var redis     = require('redis').createClient();
    
    
    redisScan({
            redis: redis,
            each_callback: function (type, key, subkey, value, cb) {
                console.log(type, key, subkey, value);
                cb();
            },
            done_callback: function (err) {
                console.log("-=-=-=-=-=--=-=-=-");
                redis.quit();
            }
        });
    


    1. MongoDBの既存のインデックスを削除せずに変更できますか?

    2. MongoDBでコレクションのサイズを確認する5つの方法

    3. MongoDBとMySQL

    4. mongodbアグリゲーションのサブストリングと一致