Redis 6 RC1 is out today

Salvatore Sanfilippo

Redis 6 RC1 今日发布

又是这样,一个新的 Redis 版本进入了候选发布阶段,再过几个月,它就会上架到大多数超市的货架上。我想这迄今为止是最“企业级”的 Redis 版本了,说来也很有趣,我花了相当长的时间才弄明白“企业级”到底意味着什么。我想这是个我真心不喜欢的词,但它确实有一定含义。Redis 如今已无处不在,同时它依然相当能够“向下扩展”:你仍然可以下载它,30 秒内完成编译,无需任何配置就能运行起来开始折腾。但无处不在也意味着要身处那些加密和 ACLs(访问控制列表)必不可少的环境中,所以 Redis 不可避免地——与其说多亏了我,不如说是不顾我对简洁性的极致追求——还是做出了适应。

但有趣的是,即便是新增功能,也可以以非常有主见的方式来实现。Redis 的 ACLs 与你在其他系统中见过的东西几乎毫不相似,而 SSL(安全套接层)支持则经过了几轮迭代,才最终选定了那个从保持核心尽可能干净的角度来看最合理的方案。我对结果相当满意。

据我所知,Redis 6 带来的不仅仅是 ACLs 和 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  喜欢兰花山丘

感谢以上各位,女士们先生们,这是一次出色的团队合作。变更日志中的新功能列表如下:

  • 大量新的 modules APIs(模块 API)。
  • 更优的过期周期。
  • SSL
  • ACLs
  • RESP3
  • Client side caching(客户端缓存)
  • Threaded I/O(多线程 I/O)
  • Diskless replication on replicas(副本无盘复制)
  • Redis-benchmark cluster support + Redis-cli improvements
  • Systemd support rewrite。
  • Redis Cluster proxy(集群代理)随 Redis 6 一同发布(但在不同仓库)。
  • Disque 模块随 Redis 6 一同发布(但在不同仓库)。

如你所见,有很多重磅内容。我将对其中几项多说几句。

RESP3

十年之后,我们需要一种新协议,我曾在此处详细谈过它 http://antirez.com/news/125,但后来我改变了想法,所以 Redis 6 中的 RESP3 协议是“可选加入”的。连接以 RESP2 模式开始,只有在使用新的 HELLO 命令完成握手后,你才会进入新协议模式。

为什么需要新协议?因为旧协议的语义不够丰富。RESP3 中还有其他特性,但主要思想是能够直接从 Redis 返回复杂数据类型,而无需客户端去判断该将返回的扁平数组转换成何种类型,或是将返回的数字当作本应是布尔值来处理,诸如此类。

由于 RESP3 并非唯一受支持的协议,我预计其采用速度会比预期的要慢,但也许这终究不是坏事:我们将有时间去适应。

ACLs

对 Redis ACLs 最好的介绍就是 ACL 文档本身(https://redis.io/topics/acl),尽管它可能还需要一些更新来匹配最后时刻的改动。因此在这里谈动机更有意思。Redis 需要 ACLs,是因为人们在更大的环境中需要 ACLs,以便更好地控制哪个客户端可以执行某些操作。但为 Redis 添加 ACLs 的另一个主要目的是隔离,以防止应用错误破坏数据。如果你的工作进程只能执行 BRPOPLPUSH,那么新来的开发者为调试而添加的 FLUSHALL 因失误进入生产代码并造成长达 5 小时噩梦的几率,就会更低。

Redis 中的 ACLs 是零成本的,无论是从运维角度——因为如果你不用它们,你完全可以当作不知道它们的存在——还是从性能角度——因为其开销无法衡量。我想拥有它们是一笔划算的交易。额外加分的是,我们现在有了一个用于 ACLs 的 Redis modules interface(模块接口),因此你可以编写自定义的身份验证方法。

SSL

现在是 2019 年,几乎到 2020 年了,也有了新的法规。唯一的问题是如何把它做对。而要做对,就需要先做错,理解其中的局限,然后对 Redis 连接进行抽象以便正确实现。这项工作完全是在没有我帮助的情况下完成的,这显示了近年来 Redis 开发流程的变化。

客户端缓存

我曾在此处就此写过博客 http://antirez.com/news/130,不过我认为目前这是 Redis 6 中最不成熟的功能。是的,服务器能够协助你在客户端缓存值,这很酷,但在 Redis 6 GA 发布之前,我想对此加以改进。特别是,增加一种要求服务器无需维护任何关于客户端的状态、或只需维护极少状态,并以更多消息为代价的新模式,会非常好。此外,目前用于使某些“缓存槽”失效的消息还无法合并为一条。关于这个功能,一月份还有更多工作要做,但它会变得很出色。

作为模块的 Disque

我终于做到了 :-) https://github.com/antirez/disque-module,我对结果非常满意。作为模块的 Disque 真正展示了此时 Redis 模块系统有多么强大。集群消息总线 APIs、阻塞和恢复客户端的能力、定时器、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,modules API 完全达到了一个新高度。这是 Redis 历史上成熟最快的部分之一,因为 Redis Labs 从第一天起就使用模块系统来开发非常复杂的东西,而不仅仅是简单的示例。不久前我开始了 Disque 的移植,这也促使我为模块系统带来了新功能。结果是,Redis 真正成为一个用于将系统编写为模块的框架,无需从零开始发明一切,并且由于采用 BSD 许可,Redis 确实是一个开放的系统编写平台。

内部机制

对 Redis 内部有大量改进:命令被复制的方式发生了很大变化,过期机制现在使用了一种更快、缓存更友好的不同算法。

状态与预计发布时间

今天我们发布了 RC1,我希望在三月底之间,或最迟五月,你能看到 GA 就绪。目前 Redis 6 绝对是可测试的,你遇到缺陷的几率非常小。然而它包含了大量的代码变更,而新功能都是由此前从未在生产环境中运行过的新代码组成的。因此如果你发现了问题,请在问题系统中报告,并尽可能详细地描述所发生的情况。

感谢所有让此次发布成为可能、并将在未来几个月致力于使其达到非常稳定状态的每一个人。

哦,我差点忘了!这是版本 6 的 LOLWUT 命令交互式艺术作品:

每次运行都会显示一幅随机生成的不同风景。

原文由 Salvatore Sanfilippo 发布

本文章由 muse-spark-1.2-contributor 进行翻译