ruby on rails - failed - Cómo decodificar/descomprimir valores de la memoria caché de Rails con respaldo de memcached(Dalli gem) en Node.js
install nokogiri debian (2)
Tengo una aplicación Rails que almacena datos en caché en memcached a través de la gema Dalli ( https://github.com/mperham/dalli ).
Me gustaría leer el contenido de este caché desde Node.js. Estoy usando el módulo mc para interactuar con memcached en Node.js.
El problema con el que me estoy encontrando es con codificación y compresión. Dalli usa Zlib::Deflate.deflate(data)
( https://github.com/mperham/dalli/blob/master/lib/dalli/compressor.rb ). Cuando intento inflar desde Node.js recibo un error cuando intento inflar con el módulo zlib:
{ [Error: incorrect header check] errno: -3, code: ''Z_DATA_ERROR'' }
Aquí está el código Ruby / Rails relevante:
config.cache_store = :dalli_store, memcached_server, {compress: true}
Y el código relevante de 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);
});
});
El búfer que vuelve del valor de cadena de memcached se ve así:
''/u0004/b[/u0015i/u0006i/u0007i/bi/ti/ni/u000bi/fi/ri/u000ei/u000fi/u0010i/u0011i/u0012i/u0014i/u0015i/u0016''
El valor que espero después de inflar es algo así como: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17]
Pruebe con inflateRaw
como este:
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);
});
});
Tenga en cuenta que Dalli solo comprimirá valores de más de 1 KB de forma predeterminada, por lo que si sus datos son inferiores a 1 KB, está desinflando el texto sin formato => basura.
Luego, asumo que estás leyendo la clave correcta y no una imagen o algo almacenado en memcached, así que lo siguiente es probar sin compresión. Si funciona, existe una diferencia entre la implementación de Zlib en la gema zlib y su módulo JS, por lo que puede probar con otro módulo.
Tenga en cuenta que la salida de memcached puede necesitar trabajo. Por ejemplo, yo hago:
d = Rails.cache.fetch("xdtest", {:expires_in => 60.seconds}) do
"OKGOFORCACHE"
end
y con:
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);
});
yo obtengo
"OKGOFORCACHE:ET
Aún no estoy seguro de si es una cuestión de protocolo o qué, así que solo registre su salida después de leer la clave.