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

我想从Node.js读取此缓存的内容。我正在使用mc模块与Node.js中的memcached接口(interface)。

我遇到的问题是编码和压缩。 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的字符串值返回的缓冲区如下所示:
'\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默认情况下使用ruby native 编码对值进行序列化。

如果要使用多种语言的memcached值,请考虑使用其他serializer,请参阅有关配置https://github.com/petergoldstein/dalli#configuration的文档

10-07 19:07