【问题标题】:Redis compressing string values in .net MVCRedis在.net MVC中压缩字符串值
【发布时间】:2014-04-11 19:47:30
【问题描述】:

在我的应用程序中,我想压缩存储在 redis 字符串键中的数据。 我不想压缩所有这些,因为小数据值不能很好地压缩,我想避免它们的 cpu 开销。

我的问题是,当我读取字符串键以执行解压缩时,如何检测到值被压缩?

我尝试了一些代码将自定义标头附加到 zip 流,但我没有任何运气。

【问题讨论】:

    标签: c# asp.net-mvc redis gzipstream


    【解决方案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)。

    最后的忠告:不要弄乱有效负载本身(例如更改 zip 标头),这势必会给您带来很多不必要的麻烦。

    希望这会有所帮助,TW

    【讨论】:

    • 我想我明白了你的意思,如果我错了,请纠正我。我将创建另一个流,写入前缀并复制压缩流......对吗?
    • 这是一种方法(也许这是在 C#/BookSleeve/StackExchange.Redis 中最简单的方法,无论您使用哪种方法)。您还可以为您的对象编写自定义序列化程序。发送到 Redis 的结果始终是一个简单的字节数组。 Redis 键/值/字符串始终是二进制安全的,取决于您如何使用它。
    • 那太好了!谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多