带有redis的消息包,其中数据大小不大

Posted

技术标签:

【中文标题】带有redis的消息包,其中数据大小不大【英文标题】:messagepack with redis where size of data is not big 【发布时间】:2018-04-30 08:49:51 【问题描述】:

Redis 是一种数据结构存储,但仍建议使用消息包(或 protobuf)来序列化/反序列化数据。如果写入 Redis 的数据块不是很大,我会对 Redis 之上的 Messagepack 感到困惑。

因为,Messagepack 需要根据自己的协议打包和解包数据,并且肯定会产生一些成本,并且打包的数据将仅作为“字符串”数据类型存储在 Redis 上。

为了利用 Redis 作为数据结构服务器,可以编写一个薄层来直接读取/写入 redis 数据结构,比如说在 C++ 和 Python 之间,那么消息包到底适合哪里?

有人可以解释一下 redis 上下文中的消息包吗?

问候, 拉胡尔

免责声明 - 没有冒犯 Messagepack 功能,我知道它真的很棒 :-)

【问题讨论】:

我使用MessagePack作为redis的key。它包含在 name:string 和 id:64 位无符号整数中。在这种情况下,我使用 MessagePack ARRAY github.com/msgpack/msgpack/blob/master/… 的 str github.com/msgpack/msgpack/blob/master/… 和整数 github.com/msgpack/msgpack/blob/master/… 。我通过 redis 上的 EVAL 命令使用 lua cmsgpack 函数redis.io/commands/eval#cmsgpack。优点的大小比 id 的字符串小。并且易于来回转换。 【参考方案1】:

没有单一的答案,但我可以提供一些指导。

Redis 的基本数据类型是字符串 - 它是二进制安全的,最多可容纳 0.5GB(在即将发布的版本中可能会更多)。 键名是字符串,但您通常希望 a) 保持简短 b) 它们是访问数据的唯一方法,因此希望其清晰易读和可重构。 值可以是字符串。如果有效载荷已经是一个字符串 - 不需要序列化/反序列化,只需按原样存储。常见示例:jpg 或 png 文件。 如果您的应用已经在使用 msgpack(或 json 或 protobuff 或...),您可以存储序列化的表单。 Redis 的 Lua 具有用于处理 json 和 msgpack 的内置库。 有一些模块(例如http://rejson.io)可以扩展它。

希望对你有帮助。

免责声明:上述模块的作者,Redis 极客,拥有使用 Redis 的 Lua 工作的黑带;)

【讨论】:

谢谢!这回答了我当前的用例,我必须处理字符串值,所以我现在会跳过序列化/反序列化步骤 messagepack )。

以上是关于带有redis的消息包,其中数据大小不大的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现消息队列的4种方案

程序员过关斩将--redis做消息队列,香吗?

C# Socket 封包 拆包 ProtoBuf 的使用

Redis5新特性Streams作消息队列

如何使用NODEJS+REDIS开发一个消息队列

带有 Redis 队列的标签 5.x 生成大量日志