Redis 6 RC1 今日发布
原文由 Salvatore Sanfilippo 于 发布,订阅该博客
历史再次上演,新版 Redis 进入了候选发布阶段,再过几个月,它就会出现在大多数超市的货架上。我想这是迄今为止最“企业级”的 Redis 版本,说来好笑,我花了相当长的时间才弄明白“企业级”到底意味着什么。这是个我真心不喜欢的词,但它确实有其含义。Redis 如今已无处不在,却依然很好地保持了“向下扩展”的能力:你仍然可以在 30 秒内下载、编译,无需任何配置就能跑起来折腾。但无处不在也意味着要进入那些加密、ACL 等必不可少的环境,所以 Redis 不可避免地做出了适应——与其说是多亏了我,不如说是不顾我对简洁的极致追求而做出的适应。
但有趣的是,即便是新增的功能,也可以用非常有主见的方式来实现。Redis 的 ACL 与你在其他系统中见过的几乎毫无相似之处,而 SSL 支持则经过了几轮迭代,最终才选定了那个从让核心尽可能保持干净的角度来看最为合理的方案。我对结果相当满意。
Redis 6 带来的不只是 ACL 和 SSL,据我所知,这是 Redis 迄今为止最大的一次发布,也是参与人数最多的一次。所以,先来致谢。是谁打造了 Redis 6?以下是按提交次数统计的贡献者名单(这是个很糟糕的指标,但却是我能轻松生成的),只包含至少有两次提交、且排除了合并提交的贡献者。另请注意,我的提交数可能被大幅高估了,因为我一直在不停地修补各种细枝末节。
685 antirez
81 zhaozhao.zz
76 Oran Agra
51 artix
28 Madelyn Olson
27 Yossi Gottlieb
15 David Carlier
14 Guy Benoish
14 Guy Korland
13 Itamar Haber
9 Angus Pearson
8 WuYunlong
8 yongman
7 vattezhang
7 Chris Lamb
5 Dvir Volk
5 [email protected]
5 chendianqiang
5 John Sully
4 dejun.xdj
4 Daniel Dai
4 Johannes Truschnigg
4 swilly22
3 Bruce Merry
3 filipecosta90
3 youjiali1995
2 James Rouzier
2 Andrey Bugaevskiy
2 Brad Solomon
2 Hamid Alaei
2 Michael Chaten
2 Steve Webster
2 Wander Hillen
2 Weiliang Li
2 Yuan Zhou
2 charsyam
2 hujie
2 jem
2 shenlongxing
2 valentino
2 zhudacai 00228490
2 喜欢兰花山丘感谢以上所有朋友,这是一次了不起的团队合作,女士们、先生们。更新日志中的新特性列表如下:
- 大量全新的模块 API。
- 更优的过期循环。
- SSL
- ACL
- RESP3
- 客户端缓存
- 多线程 I/O
- 副本上的无盘复制
- Redis-benchmark 集群支持 + Redis-cli 改进
- Systemd 支持重写。
- 随 Redis 6 发布了 Redis Cluster proxy(但在不同仓库)。
- 随 Redis 6 发布了 Disque 模块(但在不同仓库)。
如你所见,有很多重磅内容。下面我挑其中几项多说几句。
RESP3
十年之后,我们需要一种新协议,我曾在这里详细谈过 http://antirez.com/news/125,但后来我改变了主意,所以 Redis 6 中的 RESP3 协议是“可选接入”的。连接默认以 RESP2 模式开始,只有当你使用新的 HELLO 命令完成握手后,才会进入新协议模式。
为什么需要新协议?因为旧协议的语义不够丰富。RESP3 还有其他特性,但核心思想是让 Redis 能够直接返回复杂的数据类型,而无需客户端自行判断该把返回的扁平数组转换成什么类型,或是把本该是布尔值的数字再做转换,诸如此类。
由于 RESP3 并非唯一支持的协议,我预计它的普及速度会比预期的要慢,但这或许未必是坏事:我们会有时间去逐步适应。
ACL
关于 Redis ACL 最好的入门介绍就是 ACL 文档本身(https://redis.io/topics/acl),虽然它可能还需要更新以跟上最后一刻的改动。所以在这里谈谈动机更有意思。Redis 需要 ACL,是因为人们在更大规模的环境中需要 ACL,以便更好地控制哪些客户端可以执行特定操作。但为 Redis 添加 ACL 的另一个要点在于隔离,以防止应用缺陷破坏数据。如果你的 worker 只能执行 BRPOPLPUSH,那么新来的开发者为调试而加入的 FLUSHALL 因失误被带到线上、并造成长达 5 小时噩梦的概率就会小得多。
Redis 中的 ACL 是零成本的,无论是从运维角度——如果你不用它们,完全可以当作不知道它们的存在——还是从性能角度——其开销几乎无法测得。我想,拥有它们是一笔很划算的交易。另外,我们现在为 ACL 提供了 Redis 模块接口,因此你可以编写自定义的认证方式。
SSL
现在是 2019 年,马上就 2020 年了,也有了新的法规要求。唯一的问题是如何把它做对。而要做对,就得先做错、理解其中的局限,然后再对 Redis 的连接进行抽象才能真正做对。这项工作完全是在没有我参与的情况下完成的,这也体现了近年来 Redis 开发流程的变化。
客户端缓存
我曾在这里写过相关博客 http://antirez.com/news/130,不过我认为目前这是 Redis 6 中最不成熟的功能。没错,服务器能协助你在客户端缓存数据很酷,但在 Redis 6 正式版发布前,我还想进一步完善它。特别是,增加一种新模式会非常好——让服务器无需维护任何关于客户端的状态,或只需维护极少状态,以更多消息为代价来换取。此外,目前用于使某些“缓存槽”失效的消息还无法合并为一条。关于这个功能,一月份还有更多工作要做,但它会是一个很棒的功能。
作为模块的 Disque
我终于做到了 :-) https://github.com/antirez/disque-module,而且我对结果非常满意。Disque 作为模块真正展现了 Redis 模块系统如今的强大:集群消息总线 API、阻塞与恢复客户端的能力、定时器、以及对模块私有数据的 AOF 和 RDB 控制。如果你不知道 Disque 是什么,可以去看看这个仓库:README 写得相当详尽。
集群代理
我的同事 Fabio 为这个 Redis Cluster proxy 投入了数月时间:https://github.com/artix75/redis-cluster-proxy。我期待这一刻已经很久了,在 Redis Cluster 支持方面,客户端生态一直非常分散,所以现在我们有了一个(仍在开发中的)代理,可以做许多有趣的事情。最主要的一点是为客户端抽象掉 Redis Cluster,让它们感觉像是在与单个实例对话。另一点是执行多路复用,至少在场景简单、客户端只使用简单命令和功能时是如此。当需要阻塞或执行事务时,代理会为客户端分配另一组连接。该代理还是完全多线程的,因此如果你的大部分 CPU 时间都花在 I/O 上,它可以很好地帮你最大化 CPU 利用率。请查看项目的 README 了解当前状态,并试用一下!
模块
有了 Redis 6,模块 API 完全提升到了新的高度。这是 Redis 历史上成熟最快的部分之一,因为 Redis Labs 从一开始就利用模块系统来开发非常复杂的东西,而不只是些简单示例。前段时间我开始移植 Disque,这也促使我为模块系统带来了新特性。结果就是,Redis 真正成为了一个以模块形式编写系统的框架,无需从零开始发明一切,而且由于采用 BSD 许可,Redis 确实是一个开放的系统编写平台。
内部实现
Redis 内部也有大量改进:命令的复制方式有了不小的变化,过期机制现在使用了另一种更快、缓存更友好的算法。
状态与发布时间
今天我们发布了 RC1,我希望在三月底之间,最迟五月,你就能看到正式版。现在的 Redis 6 已完全可以测试,遇到 bug 的概率非常小。但它包含了大量代码改动,新功能也都由此前从未在生产环境中运行过的新代码构成。所以如果你发现了问题,请在 issue 系统中尽可能详细地描述所发生的情况并报告。
感谢所有让这个版本成为可能、并将在接下来几个月中为其达到非常稳定状态而努力的每一个人。
哦,差点忘了!这是版本 6 中 LOLWUT 命令的交互式艺术:

每次运行都会显示一幅随机生成的不同风景。
随机一篇博客
评论
登录后参与讨论