在我的应用程序中,我想压缩存储在redis字符串键中的数据。 我不想压缩所有这些,因为小数据值不能很好地压缩,我想避免它们的CPU开销。
我的问题是当我读取字符串键以执行解压缩时如何检测值是否被压缩?
我尝试了一些代码来为zip流添加自定义标题,但我没有运气。
答案 0 :(得分:1)
常见的模式是使用有效负载前缀和分隔符。
例如,您可以使用以下格式:
[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)。
最后的建议:不要弄乱有效载荷本身(比如改变拉链头),这样会给你带来很多不必要的麻烦。
希望这有帮助,TW