写点什么

为什么 Redis 6 只支持 RESP3 ?

  • 2020-02-28
  • 本文字数:1940 字

    阅读完需:约 6 分钟

为什么 Redis 6 只支持 RESP3 ?


Redis 5 发布几周后,我开始着手实现 RESP3,经过几天的工作,可以实现这一目标了。RESP3 是 Redis 将从 Redis 6 开始使用的新的客户端-服务器协议,https://github.com/antirez/resp3 上的规范清楚地说明我们旧协议 RESP2 的这种演进可以如何改进 Redis 生态系统,其中最重要的是,RESP3 比 RESP2 更加“语义化”。例如,它具有映射,集合(元素的无序列表),返回数据的属性(可以使用辅助信息来增强回复)等概念。最终目标是使新的 Redis 客户端为我们减少工作量,也就是说,只需确定一组固定规则,即可将每种回复类型从 RESP3 转换为给定类型的客户端库编程语言。


在 Redis 的未来中,我看到了一些更智能的客户端,更好的处理连接、流水线和状态,并且显然在面向用户方面要简单得多,以至于理想 Redis 客户端就像:


result= redis.call(”GET”,keyname);
复制代码


当然最重要的是,你可以构建更高级的抽象,但是最底层应该看起来像这样,并且返回的回复不应要求对特定命令进行临时过滤:RESP3 返回类型应包含足够的信息以返回适当的数据类型,因此 HGETALL 将返回 RESP3“映射”,而 LRANGE 将返回“数组”,而 EXISTS 将返回 RESP3“布尔”。


即使客户端库不是专门为处理它而设计的,新命令也能够按预期工作。在 RESP2 中,该命令可能返回“缺少方法”之类的错误,但后来在客户端库中确实实现了该命令时,返回的类型发生了变化,从而引入了轻微的不兼容性。


但是,尽管新协议是对旧协议的增量改进,它还是会在客户端库侧和在应用层中引入不兼容性。例如,由于 ZSCORE 现在将返回 double 类型,而不是 string 类型,因此应更新应用程序代码,或者客户端库可以实现兼容性选项,该选项将把 RESP3 回复变回其原始 RESP2 类型。


如果不对新协议进行适配,Lua 脚本也将不能正常工作,因为 Lua 还将看到 redis.call()命令返回的更多语义类型,同样 Lua 将能够返回在 RESP3 中实现的所有新数据类型。


因此,人们对我的决定感到恐惧:我将在 Redis 6 发行时仅支持 RESP3,没有将 Redis 6 服务器切换到 RESP2 的兼容模式,因此您要么升级客户端库并升级应用程序(或使用客户端库向后兼容模式),要么无法切换到 Redis 6。


我这样做是有充分的理由的,我想解释为什么我要做出这个决定,以及如何减轻用户和客户端库作者的问题,让我们从缓解措施开始:


(1)Redis 6 发行后的 2 年内将完全支持 Redis5,所有关键内容都将移植到 Redis 5,并且补丁程序级别的发行版将一直可用。


(2)Redis 6 预计将在大约 1 年或一年半内发布,但是 Redis 6 将在大约 1 个月内切换到 RESP3,因此,人们将使用、尝试和处理不稳定的 Redis 版本,该版本长时间使用新协议。与许多其他软件不同,Redis stable 具有大量的临时用户,这既是因为它是 Github 上的默认分支,又因为传统上 Redis stable 从未真正如此不稳定,所以这会带来很多先前的风险。


(3)我仍然不能 100%确定,但是 Lua 脚本引擎可能具有兼容模式,以便返回与 Redis 5 相同的类型。但是,默认情况下不会启用兼容性,并且会在调用 Redis 命令之前通过调用特殊的 redis.resp2_compat()函数,选择启用每个执行的脚本。因此,无论其配置如何,每台 Redis 6 服务器都将表现出相同的行为,就像 Redis 在过去 10 年中一样。


这些是缓解措施,这就是我决定 Redis 6 不同时支持两个版本的原因:


(1)也许是完全无用的。如果人们将 Redis 6 切换到 RESP2 模式,他们就会一直停留在过去,在没有 RESP2 支持的情况下等待 Redis 7 推出并打破一切。同时当您使用一个 Redis 6 时,根据配置的方式,你永远不会知道它会回复什么,相同的客户端库可能会为相同的命令返回哈希或数组。


(2)没有充分的理由,这需要更多的工作和更多的复杂性(请参阅“1”),许多命令将需要检查旧协议,以查看以哪种格式答复。


(3)通过将 Redis6 的新功能与协议的变更绑定在一起,我们为用户提供了充分的理由进行切换并移植其客户端和应用程序。总有一天一切都会结束,我们可以专注于新事物。否则,我们将拥有一些这样的 Redis 6 用户,这些用户已切换到新服务器以使用新功能,但仍使用旧协议,而且使用 Redis 7 时也会重蹈覆辙。


(4)如果有人告诉你改写客户端库是一件很糟糕的事情,那么我可不敢苟同。是需要做一些更改,但是既然我正在实现服务器端,我发现它并不那么糟糕,其实可怕的是,大多数客户端的工作根本没有报酬,而仅仅是因为热情和与他人分享的意愿。我敢打赌,我们很快就会看到 RESP3 的许多实现。


(5)RESP3 的设计使客户端可以自动检测它是 RESP2 还是 RESP3,并进行切换,因此新客户端可以同时使用 Redis 6 和 Redis 5 以及之前版本。


我希望它可以阐明我的观点及其背后的原因,同时希望在协议切换期间启用的缓解措施可以使用户相信这不会造成很“严重”的破坏。


2020-02-28 17:241086

评论 1 条评论

发布
用户头像
拜托放一下原文链接好吗?
2021-12-25 18:41
回复
没有更多了
发现更多内容

Thanos 架构剖析(一)Thanos 架构总览

耳东@Erdong

架构 Thanos 签约计划第二季

Thanos 架构剖析(五)历史数据怎么办

耳东@Erdong

Thanos 签约计划第二季 compactor

1-10聚合架构第十一讲:不服?那得治!

钰湚—付晓岩

广州站 | 云原生 Serverless 技术实践营精彩回顾

阿里巴巴云原生

阿里云 Serverless 云原生 线下活动

阿里云 FaaS 架构设计与创新实践

阿里巴巴云原生

阿里云 Serverless 云原生 Faas

Hystrix

李子捌

微服务 28天写作 12月日更

2020年净利暴涨1288%,遨森电商携手DataPipeline构建实时数据融合体系跑出加速度!

DataPipeline数见科技

数据库 大数据 中间件 数据融合 数据管理

Thanos 架构剖析(三)如何选择 Sidecar 和 Receiver

耳东@Erdong

Thanos 签约计划第二季 Sidecar Receiver

学习源码整体架构系列 | 前端

若川

内容合集 签约计划第二季 技术专题合集

底层逻辑的生命力

卢卡多多

28天写作 12月日更

Thanos 架构剖析(六)告警规则如何管理

耳东@Erdong

Thanos 签约计划第二季 Rule

Volatile 原理七:volatile都不保证原子性,为啥我们还要用它

悟空聊架构

volatile 原子性 28天写作 悟空聊架构 12月日更

Go 语言快速入门指南:第四篇 与数据为舞之数组

宇宙之一粟

数组 签约计划第二季 12月日更

重学计算机组成原理(4)-还记得纸带编程吗?

JavaEdge

12月日更

Thanos 架构剖析(二)统一的查询入口

耳东@Erdong

Thanos query 签约计划第二季 Query Frontend

创业研发团队的氛围营造

wood

创业 管理 28天写作

模块2作业

miliving

【Spring Boot 快速入门】七、Spring Boot集成RabbitMQ

小阿杰

RabbitMQ SpringBoot 2 内容合集 签约计划第二季

Python Qt GUI设计:窗口之间数据传递(拓展篇—5)

不脱发的程序猿

Python qt PyQt GUI设计 窗口之间数据传递

和12岁小同志搞创客开发:手撕代码,做一款遥控灯

不脱发的程序猿

少儿编程 DIY 智能硬件 创客开发 Arduino

对上管理

张老蔫

28天写作

拆解&组合

圣迪

数据 创新 组合 拆解 要素

神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践

刘悦的技术博客

人工智能 机器学习 深度学习 PyTorch 图像处理

和12岁小同志搞创客开发:手撕代码,做一款数字骰子

不脱发的程序猿

少儿编程 DIY 智能硬件 创客开发 Arduino

Thanos 架构剖析(四)数据存储和运维工具

耳东@Erdong

store tools Thanos 签约计划第二季

45 K8S之系统扩展CRD/自定义API Server

穿过生命散发芬芳

k8s 28天写作 12月日更

Go 语言快速入门指南:第三篇 流程控制

宇宙之一粟

for 流程控制 swith 签约计划第二季 if语句

腾讯新闻基于 Flink PipeLine 模式的实践

腾讯云大数据

flink pipeline 流计算 Oceanus

【Spring Boot 快速入门】六、Spring Boot集成Redis

小阿杰

redis SpringBoot 2 内容合集 签约计划第二季

你还在一个挨一个的删除镜像文件吗?

liuzhen007

28天写作 12月日更

Go 语言快速入门指南:第五篇 与数据为舞之切片

宇宙之一粟

golang slices 切片 签约计划第二季 12月日更

为什么 Redis 6 只支持 RESP3 ?_语言 & 开发_中间件小哥_InfoQ精选文章