当前位置: 首页
数据库
Redis String存储序列化对象_对比JSON与Protobuf性能差距

Redis String存储序列化对象_对比JSON与Protobuf性能差距

热心网友 时间:2026-04-24
转载

Redis String存对象,JSON和Protobuf谁更快?

开门见山,先说结论:在绝大多数性能测试中,Protobuf的序列化与反序列化速度普遍比JSON快上2到5倍,同时内存占用能降低30%到60%。不过,这个优势有个重要前提:你的对象结构得足够稳定,并且已经预定义了schema。如果只是临时存个配置,或者调试时随手扔个Map进去,那JSON反而更省事,没必要硬上Protobuf。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Protobuf序列化+反序列化速度普遍比JSON快2–5倍,内存占用低30%–60%,但需结构稳定且有预定义schema;临时配置或调试用JSON更省事。

Redis String存储序列化对象_对比JSON与Protobuf性能差距

json.dumps() vs protobuf.SerializeToString() 实测差异点

光说理论不够直观,来看一个Python环境下的实测。使用redis-py库,存储一个包含10个字段的用户对象(其中嵌套了地址信息和时间戳),反复压测10万次,结果差异非常明显:

  • 使用json.dumps(),平均每次耗时约85微秒,生成的字符串平均长度在320字节左右。
  • 换成protobuf.SerializeToString(),平均耗时骤降至约22微秒,生成的字节流平均长度仅为126字节。
  • 反序列化的差距则更为悬殊。JSON需要经历完整的解析和类型推断过程,而Protobuf直接按照预定义的schema填充字段即可,速度通常能快上4倍以上。
  • 这里有个细节值得注意:json.dumps()默认无法处理datetime对象,直接使用会抛出TypeError;而Protobuf的timestamp字段必须使用google.protobuf.timestamp_pb2.Timestamp进行转换,否则写入同样会失败。

Redis里存Protobuf要注意的三个硬限制

Protobuf性能虽好,但把它存进Redis时,有几个边界条件必须心里有数。Protobuf本身并不校验数据合法性,而Redis String又是一个纯粹的字节容器,问题往往就出在这两者的结合部:

  • 必须用bytes类型写入。正确的做法是r.set(“user:123”, pb_data),其中pb_data已经是字节流。如果你试图r.set(“user:123”, pb_data.decode()),大概率会触发UnicodeDecodeError
  • 没有自动的版本兼容降级机制。假设你的消息结构从v1升级到v2,增加了一个新字段,那么还在使用v1旧schema的客户端在反序列化时,会直接静默丢弃这个新字段。相比之下,JSON至少能读出所有的key,只是旧代码里没有定义对应的字段罢了。
  • Redis不存储类型元信息。当你执行GET user:123,返回的是一串原始的字节。你必须在代码层面自己记住,这个key背后存的是UserProto还是OrderProto。一个实用的建议是在key命名中带上前缀,例如proto:user:123

什么时候该坚持用 JSON?

技术选型从来都是权衡的艺术,并非所有场景都适合换上Protobuf。尤其是在开发节奏快、数据结构频繁变动,或者需要人工直接查看Redis数据的场景下,JSON的优势就体现出来了:

  • 调试与可读性:在调试阶段,用redis-cli GET user:123直接查看值,JSON是人类可读的明文,而Protobuf则是一堆乱码——除非你事先安装了protoc并用--decode_raw来解码。
  • 前端或边缘设备直连:在一些边缘网关或前端直连Redis的特殊架构中,需要直接解析数据。JSON是Ja vaScript的天然支持,开箱即用;而Protobuf则需要额外引入解码库和逻辑。
  • 处理动态结构:当对象字段类型动态变化,比如value可能是dictlist的混合嵌套时,用Protobuf实现会非常棘手,需要设计oneof或使用Any类型,复杂度直线上升。而JSON一行json.dumps(obj, default=str)就能轻松搞定。

说到底,Protobuf的核心优势在于服务间高频、结构固定、对延迟敏感的通信场景。把它用作Redis的序列化工具,只是其能力的一个应用侧面,千万别让对序列化性能的极致追求,反过来绑架了业务本该有的灵活迭代节奏。

来源:https://www.php.cn/faq/2336302.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Redis List存储大量重复数据_利用SADD去重后再存入List优化

Redis List存储大量重复数据_利用SADD去重后再存入List优化

Redis List存储大量重复数据?别用SADD去重再存,这是个坑 开门见山,先说结论:千万别用 SADD 对 List 去重后再“存回去”。这个想法听起来挺合理,但实际上是个典型的“数据结构误用”陷阱。List 天生就允许重复,而 SADD 是 Set 结构的专属命令,把这两者硬凑在一起,不仅解

时间:2026-04-24 17:17
如何解决Python爬虫入库时的SQL注入隐患_使用SQLAlchemy参数映射

如何解决Python爬虫入库时的SQL注入隐患_使用SQLAlchemy参数映射

如何解决Python爬虫入库时的SQL注入隐患:使用SQLAlchemy参数映射 SQLAlchemy的text()配合:param参数映射之所以安全,是因为数据库驱动会将参数值作为纯数据传入,完全不参与SQL语法解析,从而避免了结构篡改;而错误地使用f-string进行拼接,则会直接导致注入漏洞。

时间:2026-04-24 17:16
如何利用SQL临时表提升复杂更新效率_分阶段处理中间数据

如何利用SQL临时表提升复杂更新效率_分阶段处理中间数据

如何利用SQL临时表提升复杂更新效率:分阶段处理中间数据 面对复杂的数据库更新任务,直接一条UPDATE语句硬上,往往会撞上性能瓶颈。有没有一种方法,能把不可优化的逻辑拆解成可索引的步骤?答案是肯定的,其核心思路就在于:利用临时表固化中间结果,实现分阶段处理。这本质上是一种“空间换时间”的策略,将计

时间:2026-04-24 17:16
SQL如何实现对关联结果的条件计数_使用COUNT结合CASE_WHEN与JOIN

SQL如何实现对关联结果的条件计数_使用COUNT结合CASE_WHEN与JOIN

SQL如何实现对关联结果的条件计数:使用COUNT结合CASE_WHEN与JOIN 在数据分析工作中,一个常见的需求是:统计主表中每个主体在关联表中满足特定条件的记录数量。比如,想知道每个用户有多少个已支付的订单。这听起来简单,但如果不理解COUNT、JOIN和GROUP BY之间的配合机制,很容易

时间:2026-04-24 17:16
SQL如何对分组结果进行二次聚合_利用嵌套子查询或CTE

SQL如何对分组结果进行二次聚合_利用嵌套子查询或CTE

SQL如何对分组结果进行二次聚合:利用嵌套子查询或CTE 在数据分析中,我们常常需要先分组汇总,再对汇总结果进行整体计算。比如,先算出每位客户的总消费,再求所有客户总消费的平均值。新手常会直接尝试 A VG(SUM(x)) 这样的写法,结果无一例外会碰壁。这背后的原因,值得深究。 直接写 A VG(

时间:2026-04-24 17:16
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程