2016-11-17 32 views
2

我在这里使用aerospike python客户端。同时存储在缓存中普通字符串我没有发现任何问题,因为当我取回钥匙,我得到我救了相同的字符串时,我做conn.get(键)如何在Aerospike(缓存)中存储Gzip内容?

import aerospike 

CONN_AEROSPIKE_CONFIG = {'hosts': [('127.0.0.1', 3000)]} 
conn = aerospike.client(CONN_AEROSPIKE_CONFIG).connect() 
key = ('namspace_name', 'set_name', 'key_name') 
value = "some big string" 
conn.put(key, {'value': value}) 

如果我想保存gzip压缩的内容在价值的地方,我没有发现任何错误,但我无法找回确切的内容。

from gzip import GzipFile 
from io import BytesIO 
def compress_string(s): 
    zbuf = BytesIO() 
    with GzipFile(mode='wb', compresslevel=6, fileobj=zbuf, mtime=0) as zfile: 
     zfile.write(s) 
    return zbuf.getvalue() 

put_value = compress_string(value) 
conn.put(key, {'value': put_value}) 
_, _, get_value = conn.get(key) 

我检查了put_value,get_value的打印值。他们不匹配,我需要gzip内容,因为我的内容超过1MB,我只需要gzip内容。请指导我在哪里做错了。


我知道,我们可以打破的内容分成较小的块存储,让他们以后串联,而我又需要获得数据后,GZIP内容。所以我想为什么不直接存储Gzip内容,但似乎并没有为我工作。任何潜在客户都会被安装,谢谢。

回答

3

如果put_value是一个字符串,它将在遇到的第一个\0字符处被截断。尝试转换put_value到发送之前的一个字节阵列:

conn.put(key, {'value': bytearray(put_value,"utf-8")}) 
+1

谢谢@ jboone100真的有帮助。但我已经取出格式“utf-8”,因为我在转换为bytearray时出错。所以我简单地重写了这行: 'conn.put(key,{'value':bytearray(put_value)})'' –