如何在Node.js中解码/解压缩来自memcached支持的Rails缓存(Dalli gem)的值

Ian*_*ers 13 ruby caching ruby-on-rails zlib node.js

我有一个Rails应用程序,通过Dalli gem(https://github.com/mperham/dalli)缓存memcached中的数据.

我想从Node.js读取此缓存的内容.我正在使用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' }
Run Code Online (Sandbox Code Playgroud)

这是相关的Ruby/Rails代码:

config.cache_store = :dalli_store, memcached_server, {compress: true}
Run Code Online (Sandbox Code Playgroud)

以及相关的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);
  });
});
Run Code Online (Sandbox Code Playgroud)

从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]

Nic*_*k M 0

请注意,默认情况下,Dalli 只会压缩超过 1K 的值,因此,如果您的数据小于 1K,那么您将压缩纯文本 => 垃圾。

接下来,我假设您正在读取正确的密钥,而不是存储在 memcached 中的某些图像或其他内容,因此下一步是尝试不压缩。如果它有效,那么 zlib gem 中的 Zlib 实现和您的 JS 模块之间存在差异,因此您可以尝试另一个模块。

请注意,memcached 的输出可能需要处理。例如,我这样做:

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

与:

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);
});
Run Code Online (Sandbox Code Playgroud)

我明白了

"OKGOFORCACHE:ET
Run Code Online (Sandbox Code Playgroud)

还不确定它是协议问题还是什么,所以只需在读取密钥后记录您的输出即可。