【发布时间】:2014-04-11 19:47:30
【问题描述】:
在我的应用程序中,我想压缩存储在 redis 字符串键中的数据。 我不想压缩所有这些,因为小数据值不能很好地压缩,我想避免它们的 cpu 开销。
我的问题是,当我读取字符串键以执行解压缩时,如何检测到值被压缩?
我尝试了一些代码将自定义标头附加到 zip 流,但我没有任何运气。
【问题讨论】:
标签: c# asp.net-mvc redis gzipstream
在我的应用程序中,我想压缩存储在 redis 字符串键中的数据。 我不想压缩所有这些,因为小数据值不能很好地压缩,我想避免它们的 cpu 开销。
我的问题是,当我读取字符串键以执行解压缩时,如何检测到值被压缩?
我尝试了一些代码将自定义标头附加到 zip 流,但我没有任何运气。
【问题讨论】:
标签: c# asp.net-mvc redis gzipstream
一种常见的模式是使用负载前缀和分隔符。
例如,您可以使用如下格式:
[key];[encoding];[metatype];[version]\t[payload]
我在这里使用分隔符; 和\t。如果您更喜欢它们,请选择其他分隔符。当然,您必须防止这些分隔符出现在您的前缀标签本身中。 [payload] 包含例如二进制数据、字符串数据等。 [encoding] 例如可以是 zip,msgpack,utf8,base64,json(只是一些想法)。
使用有效负载前缀的好处是您不必反序列化或解压缩有效负载本身即可将其用作实体。例如,在 Redis-Lua 中,您无法解压缩。但是您可以简单地读取预加载前缀,并响应客户端请求。即使您可以在 Redis-Lua 中反序列化,例如 JSON 或 MsgPack 格式,由于性能原因,您可能不想这样做。
当然还有其他选择。如果您不喜欢带有分隔符的前缀,您也可以将有效负载和编码标签放在一个数组中,并将其序列化为 MsgPack。或者,使用 JSON 作为前缀,然后是空字符,然后是有效负载。甚至(更节省内存):使用 4 或 8 个字节作为前缀大小,使用 MsgPack 作为前缀,并使用前缀大小来确定有效负载的开始位置(甚至可能是 MsgPack)。
最后的忠告:不要弄乱有效负载本身(例如更改 zip 标头),这势必会给您带来很多不必要的麻烦。
希望这会有所帮助,TW
【讨论】: