用于在 Redis 中存储大量长整型的字符串或字节数组

问题描述 投票:0回答:1

我的用例涉及在 Redis 中附加长整型集合,然后在实时延迟内一次性查询整个集合。一组的大小可以在 100 到 100,000 之间变化。在字符串和字节数组编码之间,就更快的序列化/反序列化而言,获取这些长整型的更快方法是什么?

使用字符串:我使用

Long.toString
将整数转换为字符串,并将它们推送到 Redis 集,然后使用
Long.parseLong
将字符串转换回长整型。

使用字节数组:使用协议缓冲区(Protobuf),我创建了一个 Long int64 Protobuf 消息。我将整数转换为该消息,使用

toByteArray()
进行转换并将其推送到 Redis 集,然后解析字节数组以获取消息,然后获取长整型。

serialization redis protocol-buffers
1个回答
0
投票

我会退后一步,尝试考虑整个系统,而不是专注于序列化/反序列化。 真正的瓶颈是什么?那时你在做什么?您是否正在查询 redis 内的各个元素? (在这种情况下,延迟是您可能的限制,并且如果不改变所有事物的互连方式,您就无法改变这一点)或者您是否正在提取所有值/插入批量值?在这种情况下,带宽更有可能是您的限制,但如果您经常这样做:您可能没有将 redis“集”用作“集”,其他选项可能会有所帮助。

您也没有指定您的 Redis 库/用法:如果您正在进行大量操作,“管道化”是您的朋友,可以避免每个操作的延迟成本。如果不准确地了解您在做什么,就很难知道您当前是否正在支付这笔费用,以及这是否确实是问题所在。即使您的客户端不支持管道传输,也可以通过 Lua 等方式进行批处理 - 每次往返发送 50 个(比如说)元素可能会对总体成本产生巨大影响(管道传输会更好)。

在某些情况下,ASCII 与 protobuf 与 CPU(固定宽度/字节顺序)编码的差异可能很重要,但在这种特定情况下:redis 协议本身对每个元素都有开销,这将使其毫无意义(除非这些开销是摊销,例如通过在单个有效负载中编码多个值)。

背景:我非常熟悉 redis 和 protobuf,并且每天都在网络通信方面工作。

© www.soinside.com 2019 - 2024. All rights reserved.