如何解码/解压Node.js中memcached支持的Railscaching(Dalli gem)中的值

我有一个Rails应用程序通过Dalli gem( https://github.com/mperham/dalli )在memcached中caching数据。

我想从Node.js读取这个caching的内容。 我正在使用mc模块与Node.js中的memcached进行交互。

我遇到的问题是编码和压缩。 Dalli使用Zlib::Deflate.deflate(data) ( https://github.com/mperham/dalli/blob/master/lib/dalli/compressor.rb )。 当我尝试从Node.js充气时,我试图膨胀zlib模块时出现错误:

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

这里是相关的Ruby / Rails代码:

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

和相关的Node.js代码:

 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的string值返回的缓冲区如下所示:

'\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]

请注意,Dalli默认只会压缩超过1K的值,所以如果您的数据小于1K,那么您正在缩减纯文本=>垃圾。

接下来,我假设你正在阅读正确的键,而不是一些图像或存储在memcached中的东西,所以接下来的事情是尝试没有压缩。 如果有效,那么zl​​ib gem中的Zlib实现和你的JS模块是有区别的,所以你可以尝试另一个模块。

请注意,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 

不知道,如果它是一个协议的事情或什么,所以只是在读取密钥后输出你的输出。

尝试与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); }); });