在redis中存储gzip压缩数据
Storing gzipped data in redis
我有一个巨大的 python 字典,我想将其保存到 Redis 缓存中,然后有一个 API 处理程序 return 这本字典直接来自缓存
我使用 gzip
在存储到缓存之前先压缩字符串化字典
transformed_object = {...big dictionary}
byte_object = BytesIO()
data = json.dumps(transformed_object)
with gzip.GzipFile(fileobj=byte_object, mode="w") as f:
f.write(data.encode())
final_data = byte_object.getvalue()
我将其写入 Redis 缓存
context.redis.set(COMPLETE_GZIPPED_CACHE, final_data)
我有一个 API 处理程序,我想在其中 return gzip 数据
cache_list = redis.get(COMPLETE_GZIPPED_CACHE)
self.finish(
{
"status": True,
"cache_list": cache_list,
"updated_at": datetime.datetime.now(),
}
)
问题是我收到以下错误
TypeError: Object of type 'bytes' is not JSON serializable
在 return 发送到前端之前,我是否需要先将字节解码回字符串?理想情况下,我希望前端能够处理解码
有更好的方法吗?
从其他帖子中弄清楚 - 写了一个这样的函数并选择使用 zlib
def convert_to_gzip_format(dict):
stringified_object = json.dumps(dict).encode("utf-8")
compressed_file = zlib.compress(stringified_object)
base64_string = base64.b64encode(compressed_file).decode("ascii")
return base64_string
这会将其作为ascii 字符串保存到redis。然后我在前端使用 pako.js
将上面的内容解码为可读的字符串。
我有一个巨大的 python 字典,我想将其保存到 Redis 缓存中,然后有一个 API 处理程序 return 这本字典直接来自缓存
我使用 gzip
在存储到缓存之前先压缩字符串化字典
transformed_object = {...big dictionary}
byte_object = BytesIO()
data = json.dumps(transformed_object)
with gzip.GzipFile(fileobj=byte_object, mode="w") as f:
f.write(data.encode())
final_data = byte_object.getvalue()
我将其写入 Redis 缓存
context.redis.set(COMPLETE_GZIPPED_CACHE, final_data)
我有一个 API 处理程序,我想在其中 return gzip 数据
cache_list = redis.get(COMPLETE_GZIPPED_CACHE)
self.finish(
{
"status": True,
"cache_list": cache_list,
"updated_at": datetime.datetime.now(),
}
)
问题是我收到以下错误
TypeError: Object of type 'bytes' is not JSON serializable
在 return 发送到前端之前,我是否需要先将字节解码回字符串?理想情况下,我希望前端能够处理解码
有更好的方法吗?
从其他帖子中弄清楚 - 写了一个这样的函数并选择使用 zlib
def convert_to_gzip_format(dict):
stringified_object = json.dumps(dict).encode("utf-8")
compressed_file = zlib.compress(stringified_object)
base64_string = base64.b64encode(compressed_file).decode("ascii")
return base64_string
这会将其作为ascii 字符串保存到redis。然后我在前端使用 pako.js
将上面的内容解码为可读的字符串。