Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何解码/解压缩Node.js中memcached backed Rails cache(Dalli gem)中的值_Ruby On Rails_Ruby_Node.js_Caching_Zlib - Fatal编程技术网

Ruby on rails 如何解码/解压缩Node.js中memcached backed Rails cache(Dalli gem)中的值

Ruby on rails 如何解码/解压缩Node.js中memcached backed Rails cache(Dalli gem)中的值,ruby-on-rails,ruby,node.js,caching,zlib,Ruby On Rails,Ruby,Node.js,Caching,Zlib,我有一个Rails应用程序,它通过Dalli gem()在memcached中缓存数据 我想从Node.js读取此缓存的内容。我正在使用mc模块与Node.js中的memcached进行接口 我遇到的问题是编码和压缩。Dalli使用Zlib::Deflate.Deflate(数据)()。当我尝试从Node.js充气时,我在尝试使用zlib模块充气时出错: { [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' } 以下

我有一个Rails应用程序,它通过Dalli gem()在memcached中缓存数据

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

我遇到的问题是编码和压缩。Dalli使用Zlib::Deflate.Deflate(数据)()。当我尝试从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的字符串值返回的缓冲区如下所示:

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);
  });
}); 
'\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中的某个图像或其他内容,因此下一步是尝试不进行压缩。如果它工作正常,那么Zlib 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);
  });
}); 

上面没有提到的重要细节:dalli默认使用ruby本机封送来序列化值


如果您想使用多种语言的MycCurk值,请考虑使用不同的<代码>序列化器< /> >,请参阅配置< /p>的文档。您是否解决过这个问题或找到了一个工作?您尝试过<代码> ZLIB吗?