我们有一个应用程序,我们使用python在memcached中存储大量数据。我们在python中使用pylibmc,在php端我们使用php-memcached库。作为摘要
其他一切都很好,除非压缩发挥作用。这就是在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。还需要做什么其他设置?请帮忙。
这里有进一步的参考,是在python pylibmc中设置字符串后的memcached输出
get foo
VALUE foo 8 40
x+��,V�D��Ē��"����t�⒢̼t=���g\5#
END
这是使用PHP的memcached客户端存储的字符串的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!
答案 0 :(得分:3)
我认为你观察到的是因为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)
所以我认为除非你愿意修改其中一个库以使其标志与另一个一致,否则就没有出路了
修改强> 好的,所以这里是一个小补丁,为pylibmc和php-memcached同步带来压缩支持。见我的github fork of pylibmc。
大胖交战 - 它只适用于字符串,所以如果你想存储对象,你必须自己进行de / serialization(JSON)。
答案 1 :(得分:1)
Raber,
正如你所说我做了改变
将pyLibmc标志更改为1&lt;&lt; 5.在_pylibmcmodule.h文件中重新安装pylibmc
#define PYLIBMC_FLAG_ZLIB (1 << 5)
这些正确的变化吗? 还有什么需要做的吗? 因为它不起作用,得到以下错误
Warning: Memcached::get(): unknown payload type in uaTestMemcached.php on line 5
bool(false)