我们有一个应用程序,在这个应用程序中,我们使用python存储大量数据,在python中使用pylibmc,在php端使用php-memcached library.As (摘要)。
其他一切都很好,除了压缩发挥作用。这就是python中数据压缩的方式。
import pylibmc
mem = pylibmc.Client(['10.90.15.104:11211'], binary=True)
mem.set('foo','this is a rather long string. this is a rather '+
'long string. this is a rather long string. this is a rather' +
'long string. this is a rather long string', 0, 10)签入telnet时,我们会看到一些混淆的值,这意味着它被压缩了。现在用php阅读它。
$memd = new Memcached();
$memd->addServer('10.90.15.104', 11211);
echo $memd->get('foo');当上面运行时,我们得到相同的乱码值,这意味着它没有被解压缩。pylibmc使用zlib,因此我也将php的压缩类型更改为zlib。还需要做什么其他的设置?请帮帮忙。
下面是memcached在pylibmc中设置字符串后的输出,以进一步参考
get foo
VALUE foo 8 40
x+��,V�D��Ē��"����t�⒢̼t=���g\5#
END下面是memcached的输出,用于使用PHP的memcached客户机存储的字符串:
get foo
VALUE foo 48 44
�x�+��,V�D��Ē��"����t�⒢̼t=���g\5#
END如你所见,这里面有可疑的东西。pylibmc中的压缩大小为40字节,使用php-memcached压缩的数据为44字节。还请注意使用pylibmc存储的标志为8,使用php-memcached存储时为48!
发布于 2012-12-17 15:41:48
我认为您所观察到的原因是,memcache本身没有实现压缩,因此每个库都以各自的方式进行压缩,只需比较用于指示正在使用的压缩的标志。
由吡咯烷酮定义
#define PYLIBMC_FLAG_ZLIB (1 << 3) (这是标志== 8)
#define MEMC_VAL_COMPRESSED (1<<4)
#define MEMC_VAL_COMPRESSION_ZLIB (1<<5)
#define MEMC_VAL_COMPRESSION_FASTLZ (1<<6)
所以我认为,除非你愿意修改这个库中的一个使它的标志与另一个保持一致,否则就没有出路了
编辑: Ok,下面是支持pylibmc和pylibmc同步压缩支持的小补丁。请看我的集线器吡咯烷酮叉。
-它只在字符串上工作,所以如果您想要存储对象,就必须自己进行反序列化(JSON)。
发布于 2012-12-19 08:20:51
拉伯
就像你说的,我做了改变
这些变化正确吗?还需要做些什么吗?因为它不起作用,导致以下错误
Warning: Memcached::get(): unknown payload type in uaTestMemcached.php on line 5
bool(false)https://stackoverflow.com/questions/13912530
复制相似问题