2017-03-21 20 views
8

Tôi đang tạo API nút bằng javascript. Tôi đã sử dụng redis làm cửa hàng giá trị quan trọng của mình. Tôi đã tạo một ứng dụng khách redis trong ứng dụng của mình và có thể nhận các giá trị cho khóa perticular.làm thế nào để có được tất cả các khóa và giá trị trong redis trong javascript?

Tôi muốn truy xuất tất cả các khóa cùng với giá trị của chúng. Vì vậy, đến nay tôi đã làm điều này:

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

nhưng tôi luôn nhận được mảng trống để phản hồi.

có cách nào để thực hiện việc này trong javascript không?

Cảm ơn

+0

Cmon, @Bhushan - với 3K điểm bạn muốn biết tốt hơn để đặt câu hỏi mà không cần bất kỳ mã nào ... – MoshMage

+0

Có thể trùng lặp của [Lệnh Redis để nhận tất cả các khóa khả dụng?] (Http://stackoverflow.com/question/5252099/redis-command-to-get-all-available-keys) – MoshMage

+0

@MoshMage Tôi đã thêm mã. xin lỗi vì tôi đã quá bận rộn –

Trả lời

3

Trước hết, vấn đề trong câu hỏi của bạn là, bên trong for vòng lặp, client.get được gọi với một không đồng bộ callback nơi đồng bộfor vòng lặp sẽ không chờ cho các cuộc gọi lại không đồng bộ và do đó dòng tiếp theo res.json({data:jobs}); được gọi ngay sau vòng lặp for trước các cuộc gọi lại không đồng bộ. Tại thời điểm dòng res.json({data:jobs}); đang được gọi, mảng jobs vẫn còn trống [] và được trả lại với phản hồi.

Để hạn chế điều này, bạn nên sử dụng bất kỳ module lời hứa như async, bluebird, ES6 Promise, vv

Modified mã sử dụng async mô-đun,

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

Nhưng từ Redisdocumentation, nó được quan sát việc sử dụng các phím nhằm mục đích gỡ lỗi và các hoạt động đặc biệt, chẳng hạn như thay đổi bố cục không gian phím của bạn và không được khuyến khích để sản xuất các môi trường .

Do đó, tôi sẽ đề nghị sử dụng một module gọi là redisscan như sau đó sử dụng SCAN thay vì KEYS như đề xuất trong Redisdocumentation.

Cái gì đó như,

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

này sẽ nhận được tất cả các phím nhưng không có giá trị:

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

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

Bây giờ bạn cần phải nhận được các giá trị cho những phím một cách bình thường. Ví dụ:

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

hoặc với mô-đun async hoặc theo bất kỳ cách nào bạn muốn.

+0

Giá trị cần đề cập rằng tài liệu hướng dẫn rõ ràng rằng lệnh này không nên được sử dụng để làm điều đó – baao

+1

@baao Yeah. Tôi cho rằng nhận được tất cả các chìa khóa và tất cả các giá trị là một nhu cầu chứng minh rằng Redis được sử dụng một cách kỳ lạ ở đây. Thật không may câu hỏi là về một giải pháp, không phải là một bout một vấn đề, vì vậy thật khó để đề nghị bất cứ điều gì khác. – rsp

+0

_đây Redis được sử dụng một cách kỳ lạ ở đây_ Đúng vậy. : D – baao

1

Nếu client là một Object sau đó chỉ cần làm:

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

Bạn sẽ nhận được một loạt các phím và một mảng các giá trị. Giá trị I trong giá trị là value tương ứng với khóa nằm ở chỉ mục I trong keys.

1

Bạn không bao giờ nên làm điều này. Trước hết, không nên sử dụng KEYS * trong quá trình sản xuất. Thứ hai, điều này không có quy mô (cluster).

Bạn có thể sắp xếp các mục được lưu trong bộ nhớ cache vào SET và truy vấn cho các mục trong SET, sau đó truy xuất các khóa tham chiếu. Điều này cũng làm cho việc vô hiệu hóa dễ dàng hơn.

Hãy xem một số phương pháp hay nhất về lưu trữ dữ liệu.

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

2

Sự kết hợp của 2 yêu cầu:

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

thứ tự sẽ giống nhau cho cả mảng.

Các vấn đề liên quan