写点什么

为什么 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:241181

评论 1 条评论

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

从数据仓库到数据中台再到数据飞轮:金融行业的数据技术进化史

桃花键神

IM即时通讯软件,WorkPlus助力企业高效协作的企业级即时通讯系统

BeeWorks

即时通讯平台是什么?

BeeWorks

企业级即时通讯平台有哪些?探究适合企业使用的即时通讯工具

BeeWorks

有哪些好用的企业级即时通讯平台推荐

BeeWorks

来重庆工作2年,想念广东了

程序员晚枫

程序员

MES系统与其他系统的集成:提升制造业智能化的关键路径

万界星空科技

数字化转型 系统集成 ERP mes 智能制造业

数据中台进化为数据飞轮的必要

桃花键神

我一进门就看见 AI 在啪啪啪狂敲代码

江南一点雨

什么是即时通讯平台

BeeWorks

云开发让 Unity 微信小游戏实时聊起来

蛋先生DX

腾讯云 Unity 云开发 实时聊天 微信小游戏

ROS 编程入门的介绍

芯动大师

ROS

MES系统助力塑料制品行业数字化转型

万界星空科技

制造业 mes 万界星空科技 注塑行业 塑料制品行业

金融行业中如何利用数据中台的数据来有效的驱动业务决策呢?

桃花键神

macOS Ventura 13.7 (22H123) 正式版发布,ISO、IPSW、PKG 下载

sysin

macos ventura

地平线占用预测 FlashOcc 参考算法-V1.0

地平线开发者

自动驾驶 算法

FinOps三人行:共话FinOps云成本管理与AI的未来在线分享(文字+视频)

雅菲奥朗

FinOps AIGC 云成本管理 云财务管理 FinOps认证

人工智能(大模型)工程师中级课程,正式开始报名!

雅菲奥朗

人工智能 AI AIGC 人工智能工程师 人工智能工程师培训

征程 6E/M 快速上手实战 Sample-Codec

地平线开发者

自动驾驶 算法

【Paper Reading】结合 NanoFlow 研究,优化大语言模型服务效率的探索

阿里云大数据AI技术

人工智能 大语言模型 NanoFlow

凡人歌:平凡公司的技术面试

iofomo

生活 职业成长 #面试

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