2013-09-22 57 views
5

Gần đây tôi đã chuyển từ memcached sang redis trong nodejs. Điều tôi thích trong nút-memcached là tôi có thể lưu toàn bộ đối tượng javascript trong bộ nhớ. Đáng buồn là tôi không thể làm điều này bằng redis. Ví dụ, tôi có các đối tượng sau đây:Lưu trữ các đối tượng javascript lồng nhau bằng chữ đỏ - NodeJS

var obj = { 
    name: "Hello world!", 
    author: "admin", 
    user: { 
     "yolololo" : { 
      "id": "352asdsafaseww", 
      "server": 5, 
      "data" : { 
        x: 1, 
        y: 1, 
        z: 50 
      } 
     }, 
     "yolol" : { 
      "id": "358dsa", 
      "server": 7 
     } 
    } 
} 

với 3rd-Eden/node-memcached Tôi chỉ có thể làm:

memcached.set("obj", obj, 12345, function(err) { }); 

và sau đó

memcached.get("obj", function(err, data) { 
    console.log(data); 
}); 

Và tôi sẽ nhận được các đối tượng tôi đã lưu, đơn giản chỉ là vậy.

Vấn đề với redis là nếu tôi lưu các đối tượng như thế này:

redisclient.set("obj", obj, redis.print); 

Khi tôi nhận được giá trị với

redisclient.get("obj", function(err, data) { 
    console.log(data); 
}); 

Kết quả chỉ là chuỗi chứa [object Object].

Vâng tôi hiểu redis là giao thức dựa trên văn bản và nó đang cố gắng làm obj.toString(), nhưng dường như memcached chăm sóc các đối tượng và redis thì không. tôi nghĩ tôi chỉ có thể làm:

redisClient.set("obj", JSON.stringify(obj)); 

nhưng tôi không chắc chắn nếu điều này sẽ được tốt, vì sẽ có điên cao I/O và tôi không chắc chắn nếu JSON obj-> chuỗi sẽ là nút cổ chai (10k + yêu cầu/giây).

Cả hai Memcached và Redis lưu trữ dữ liệu dưới dạng chuỗi, nhưng redis có tính năng tích hợp sẵn để chuyển đổi đối tượng không?

+0

Tôi nghĩ ** memcached cửa hàng ** dữ liệu như chuỗi. ** node-memcached ** thực hiện (de) quá trình tuần tự hóa tự động. – fardjad

+0

@fardjad Vâng, bạn nói đúng, nhưng Redis có quá trình tích hợp như vậy hay tôi cần chuyển đổi thủ công? – Deepsy

Trả lời

10

Trước hết chỉ hỗ trợ sau data types:

  1. Chuỗi
  2. Danh sách
  3. Đặt
  4. Hash
  5. Sắp xếp thiết

Bạn sẽ cần phải lưu trữ đối tượng dưới dạng chuỗi trong cả hai số redis.

node-memcached phân tích cú pháp/tự động hóa dữ liệu. Nhưng node-redis thì không.

Tuy nhiên, bạn có thể triển khai các chức năng tuần tự hóa/deserialization của riêng bạn cho ứng dụng của bạn.

Cách nút-memcached stringifies một đối tượng là as follows:

if (Buffer.isBuffer(value)) { 
    flag = FLAG_BINARY; 
    value = value.toString('binary'); 
} else if (valuetype === 'number') { 
    flag = FLAG_NUMERIC; 
    value = value.toString(); 
} else if (valuetype !== 'string') { 
    flag = FLAG_JSON; 
    value = JSON.stringify(value); 
} 

Nó cũng phân tích các văn bản lấy this way:

switch (flag) { 
    case FLAG_JSON: 
     dataSet = JSON.parse(dataSet); 
     break; 
    case FLAG_NUMERIC: 
     dataSet = +dataSet; 
     break; 
    case FLAG_BINARY: 
     tmp = new Buffer(dataSet.length); 
     tmp.write(dataSet, 0, 'binary'); 
     dataSet = tmp; 
     break; 
} 
Các vấn đề liên quan