Ruby on rails 如何解码/解压缩Node.js中memcached backed Rails cache(Dalli gem)中的值
我有一个Rails应用程序,它通过Dalli gem()在memcached中缓存数据 我想从Node.js读取此缓存的内容。我正在使用mc模块与Node.js中的memcached进行接口 我遇到的问题是编码和压缩。Dalli使用Zlib::Deflate.Deflate(数据)()。当我尝试从Node.js充气时,我在尝试使用zlib模块充气时出错: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' } 以下
{ [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吗?