如何解码/解压Node.js中memcached支持的Railscaching(Dalli gem)中的值
我有一个Rails应用程序通过Dalli gem( https://github.com/mperham/dalli )在memcached中caching数据。
我想从Node.js读取这个caching的内容。 我正在使用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' }
这里是相关的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的string值返回的缓冲区如下所示:
'\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); }); });