sql >> Database >  >> NoSQL >> Redis

hoe krijg ik alle sleutels en waarden in redis in javascript?

Allereerst is het probleem in uw vraag dat, binnen de for lus, client.get wordt aangeroepen met een asynchroon terugbellen waar de synchrone for lus wacht niet op de asynchrone callback en dus de volgende regel res.json({data:jobs}); wordt direct na de for . gebeld loop vóór de asynchrone callbacks. Op het moment van de regel res.json({data:jobs}); wordt aangeroepen, de array jobs is nog leeg [] en teruggestuurd worden met het antwoord.

Om dit te verminderen, moet u beloftemodules gebruiken, zoals async , bluebird , ES6 Promise enz.

Gewijzigde code met asynchrone module,

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

Maar van de Redis documentatie, wordt opgemerkt dat het gebruik van Keys bedoeld is voor debuggen en speciale bewerkingen, zoals het wijzigen van de lay-out van de keyspace en niet aan te raden is voor productieomgevingen.

Daarom zou ik willen voorstellen om een ​​andere module genaamd redisscan te gebruiken, zoals hieronder, die gebruikmaakt van SCAN in plaats van KEYS zoals voorgesteld in de Redis documentatie.

Iets als,

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. Redis AOF fsync (ALTIJD) vs. LSM-boom

  2. Staat Redis alleen tekenreeksweergave toe, maar geen numerieke waarde?

  3. MongoDB en sluit zich aan

  4. Ideeën voor het schalen van chat in AWS?