2017-03-21 26 views
8

Javascript kullanarak bir düğüm API'si oluşturuyorum. Redis'i anahtar değer deposu olarak kullandım. Uygulamamda bir redis-client oluşturdum ve çok anahtar için değerler alabiliyorum.javascript'te redis içindeki tüm anahtar ve değerleri nasıl alabilirim?

Tüm anahtarları değerleriyle birlikte almak istiyorum. Ana Kadar bunu yaptım:

app.get('/jobs', function (req, res) { 
    var jobs = []; 
    client.keys('*', function (err, keys) { 
     if (err) return console.log(err); 
     if(keys){ 
      for(var i=0;i<keys.length;i++){ 
       client.get(keys[i], function (error, value) { 
        if (err) return console.log(err); 
        var job = {}; 
        job['jobId']=keys[i]; 
        job['data']=value; 
        jobs.push(job); 
       }); 
      } 
      console.log(jobs); 
      res.json({data:jobs}); 
     } 
    }); 
}); 

ama her zaman tepki olarak boş bir dizi döner.

javascript'te bunu yapmanın herhangi bir yolu var mı?

Teşekkür

+0

Cmon, @Bhushan - 3K puan ile herhangi bir kod olmadan bir soru yapmaktan daha iyi bileceksiniz ... – MoshMage

+0

Olası kopya [tüm mevcut tuşları almak için Redis komutu]? (Http://stackoverflow.com/questions/5252099/redis-komut-almak-all-kullanılabilir-tuşları) – MoshMage

+0

@MoshMage Kodu ekledim. üzgün olduğum için üzgünüm –

cevap

3

Öncelikle, söz konusu sorunu for döngü içinde client.get dolayısıyla bir asenkronsenkronfor döngü asenkron geri arama için beklemeyecek geri arama ve sonraki satır ile çağrılır, yani res.json({data:jobs}); Eşzamansız geri aramalardan önce for döngüsünden hemen sonra çağrılıyor. Satır res.json({data:jobs}); çağrılırken, jobs dizisi hala boş [] ve yanıtla geri döndürülüyor.

bu hafifletmek için, ES6 Promise

async modülü kullanarak

Modifiye kod,

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

Ama Redisdocumentation dan

, bu gözlenmektedir vb async, bluebird gibi herhangi vaat modülleri kullanmalıdır Anahtarlarının kullanımı, hata ayıklama ve özel alan işlemleri için tasarlanmıştır, örneğin tuş alanı düzeninizi değiştirme ve tavsiye edilmez ortamlarına kadar. Redis documentation önerildiği üzere

Bundan ötürü, burada aşağıdaki gibi redisscan olarak adlandırılan başka bir modül kullanarak öneririm SCAN yerine KEYS kullanır.

şey gibi

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
Bu, tüm anahtarları alacak

ama hiçbir değerlerle:

const redis = require('redis'); 
const client = redis.createClient(); 

client.keys('*', (err, keys) => { 
    // ... 
}); 

Artık bir olağan şekilde bu anahtarların değerlerini almak gerekir. Örneğin:

Promise.all(keys.map(key => client.getAsync(key))).then(values => { 
    // ... 
}); 

veya async modül ile ya da istediğiniz herhangi bir şekilde

.

+0

adresinin kopyası belgelerin açıkça bu komutun – baao

+1

@ baao Evet için kullanılmaması gerektiğini belirtir. Tüm anahtarların ve tüm değerlerin elde edilmesinin, Redis'in buradaki garip bir şekilde kullanıldığını gösteren bir ihtiyaç olduğunu iddia ediyorum. Ne yazık ki, soru bir çözüm değil, bir sorun değil, başka bir şey tavsiye etmek zor. – rsp

+0

_that Redis, garip bir şekilde kullanılmıştır. Bu doğrudur. : D – baao

1

client sonra Object ise sadece yapın:

var keys = Object.keys(client); 
var values = Object.values(client); 

Anahtarların dizisi ve değer dizisi alırsınız. 0'daki değerler, keys numaralı dizinde bulunan I anahtarına karşılık gelen value değerleridir. Her şeyden

1

Bunu asla. İlk olarak, üretimde KEYS * kullanılması önerilmez. İkincisi, bu bir ölçek (küme) yok.

Önbelleğe alınmış girişlerinizi SET'lerde düzenleyebilir ve SET içindeki öğeleri sorgulayabilir ve daha sonra referans tuşlarını alabilirsiniz. Bu ayrıca invalidasyonun daha kolay olmasını sağlar.

Bazı veri depolama en iyi uygulamalarına bir göz atın.

https://redis.io/topics/data-types-intro how to get all keys and values in redis in javascript?

2

kombinasyonu yararlı bir şeyler bulabilirsiniz:

import * as ioredis from 'ioredis'; 

const redis = new ioredis({ 
    port: redisPort, 
    host: redisServer, 
    password: '', 
    db: 0 
    }); 

const keys = await redis.collection.keys('*'); 
const values = await redis.collection.mget(keys); 

Sipariş iki dizide için aynı olacaktır.

İlgili konular