如何从Memcache转储给定键的压缩对象?

时间:2018-03-02 21:28:00

标签: shell memcached zlib gunzip igbinary

我使用以下命令从 memcached 转储给定键的压缩对象:

cat <(printf "\x1f\x8b\x08\x00\x00\x00\x00\x00") <(memccat CACHE-KEY) | gunzip

它打印值(一个JSON),但最后有警告:

  

gzip:stdin:意外的文件结尾

我相信它可能缺少校验和的最后4个字节(ADLER32),但我不确定。

Memcached 缓存服务以纯文本格式转储压缩键值的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

看起来memccat CACHE-KEY的结果是zlib(RFC 1950)流。您正在为gzip流(RFC 1952)提供gzip标头的十个字节中的八个作为前缀,这会导致gunzip将双字节zlib标头作为缺少的两个字节在gzip头的结尾。 gunzip然后期待一个收缩流(RFC 1951),它正在得到它,然后是一个它没有得到的gzip预告片。 gzip预告片是8个字节,由CRC-32和未压缩数据的长度组成。相反,它正在获取zlib预告片,这是一个四字节的Adler-32未压缩数据。

为了使gunzip饱和,你需要不给它zlib流的最后四个字节,用8个字节替换它,你需要计算未压缩数据的CRC-32,以及未压缩的数据。但这有点愚蠢,因为这些事情的重点是对未压缩数据的完整性检查。

您真正想要做的是将zlib流解释为zlib流,最后将使用Adler-32作为完整性检查。您可以使用pigz使用pigz -dz解码zlib流,也可以使用zlib轻松编写自己的zlib解码器。示例目录中提供了一个名为zpipe

的示例