2014-04-08 6 views
13

में memcached समर्थित रेल कैश (दल्ली मणि) से मूल्यों को संपीड़ित मैं एक रेल अनुप्रयोग है कि दल्ली मणि (https://github.com/mperham/dalli) के माध्यम से memcached में डेटा कैश कर रहा है है।कैसे डिकोड करने के लिए/Node.js

मैं इस कैश की सामग्री को Node.js. से पढ़ना चाहूंगा। मैं mode मॉड्यूल का उपयोग Node.js. में memcached के साथ इंटरफ़ेस करने के लिए कर रहा हूँ।

जिस समस्या में मैं चल रहा हूं वह एन्कोडिंग और संपीड़न के साथ है। दल्ली Zlib::Deflate.deflate(data) (https://github.com/mperham/dalli/blob/master/lib/dalli/compressor.rb) का उपयोग करता है। जब मैं Node.js से बढ़ करने का प्रयास करते समय मुझे zlib मॉड्यूल के साथ बढ़ाने के लिए प्रयास में कोई त्रुटि मिलती है:

config.cache_store = :dalli_store, memcached_server, {compress: true} 

और प्रासंगिक Node.js:

{ [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' } 

यहाँ प्रासंगिक रूबी/रेल कोड है कोड:

client = new Memcached.Client(MEMCACHED_HOSTNAME, Memcached.Adapter.raw); 


client.get(key, function (err, response) { 
    var data = response[key]; 

    zlib.inflate(data.buffer, function (err, buf) { 
    console.log(err, buf); 
    }); 
}); 

बफ़र memcached का स्ट्रिंग मान से वापस आता है इस तरह दिखता है:

'\u0004\b[\u0015i\u0006i\u0007i\bi\ti\ni\u000bi\fi\ri\u000ei\u000fi\u0010i\u0011i\u0012i\u0014i\u0015i\u0016'

मूल्य है कि मैं बढ़ा-चढ़ाकर के बाद उम्मीद कर रहा हूँ है की तरह कुछ: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17]

+0

आप कभी भी इस समस्या एक काम के आसपास का समाधान या मिला? – Jason

+0

क्या आपने इसके बजाय 'zlib.inflateRaw' कोशिश की है? @wurde – ErvalhouS

+0

क्या आप एक उत्तर में दिखा सकते हैं? – wurde

उत्तर

0

ध्यान दें कि दल्ली केवल मूल्यों 1K से अधिक डिफ़ॉल्ट रूप से, सेक होगा इसलिए यदि आपके डेटा 1K से कम आप सादे पाठ deflating रहे हैं => कचरा।

अगला, मुझे लगता है कि आप सही कुंजी पढ़ रहे हैं और कुछ छवि या कुछ memcached में संग्रहीत नहीं है, तो अगली बात संपीड़न के बिना कोशिश करने के लिए है। यदि यह काम करता है तो ज़्लिब मणि और आपके जेएस मॉड्यूल में ज़्लिब कार्यान्वयन के बीच एक अंतर है, तो आप एक और मॉड्यूल आज़मा सकते हैं।

ध्यान दें कि memcached से आउटपुट को काम की आवश्यकता हो सकती है। उदाहरण के लिए, मैं करता हूँ:

d = Rails.cache.fetch("xdtest", {:expires_in => 60.seconds}) do 
     "OKGOFORCACHE" 
    end 

और साथ:

var Memcached = require('memcached'); 
var memcached = new Memcached('localhost:11211', {retries:10,retry:10000,remove:true,failOverServers:[ ]}); 


memcached.get('Frontend:xdtest', function (err, data) { 
    console.log(data); 
}); 

मैं

"OKGOFORCACHE:ET 

सुनिश्चित नहीं हैं कि मिल अभी तक अगर यह एक प्रोटोकॉल बात या क्या है, तो बस के बाद अपने उत्पादन .log कुंजी पढ़ना

0

inflateRaw इस तरह के साथ प्रयास करें:

client = new Memcached.Client(MEMCACHED_HOSTNAME, Memcached.Adapter.raw); 

client.get(key, function (err, response) { 
    var data = response[key]; 

    zlib.inflateRaw(data.buffer, function (err, buf) { 
    console.log(err, buf); 
    }); 
}); 
संबंधित मुद्दे