如何在Aerospike(缓存)中存储Gzipped内容?

时间:2016-11-17 13:57:19

标签: python gzip aerospike

我在这里使用aerospike python客户端。在缓存中存储普通字符串时我没有发现任何问题,因为当我检索密钥时,我得到了当我执行conn.get(key)时保存的相同字符串

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。所以我想为什么不直接存储Gzipped内容,但这似乎并不适合我。任何潜在客户都会被接受,谢谢。

1 个答案:

答案 0 :(得分:3)

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

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