12月20号,Redis发布了Redis6-rc1版本,作者antirez也在自己的博客中宣布了这一消息,并对Redis6版本做了一些介绍,以下是译文。<!-- more -->
没错,新版本的Redis已经到了候选发布状态(RC版),几个月后,你就可以在各大应用市场看到新版本的Redis了。我想这大概是迄今为止,Redis最接近“企业级”应用的一个版本了,有趣的是,在这之前我花了很长时间来理解什么是企业级应用。我认为我并不喜欢这个词,但是它还是有一些意义的。现在Redis可以说是无处不在,并且仍然能够“缩小规模”:你可以直接下载它,在30秒内完成编译,然后在不需要进行任何配置的情况下启动它。但是无处不在意味着加密和ACL之类的环境也是必须要支持的,因此Redis必须要感谢我,尽管我极力追求简单性。
有趣的是,Redis ACL虽然是以一种武断的方式进行添加,但它几乎与你在其他系统中看到的都不一样,对SSL的支持也是经过了数次迭代,以达到最终使用最有意义的想法的目的。从让核心功能尽可能简洁的角度来看,我对这些改动还是很满意的。
Redis6为我们带来的不仅仅是ACLs和SSL,据我所知,这是Redis发行的功能最多,也是参与人数最多的一个版本了。都有谁为Redis6做出了贡献呢?我生成了一个贡献者列表(我知道这个列表很烂,我只是简单生成了一下),他们至少有两个commit,并且不包括合并提交。另外,由于我不断在这里或那里修复许多小东西,因此我的提交次数可能会远超他人。
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 meir@redislabs.com 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
- ACLs
- RESP3
- 客户端缓存
- 线程I/O
- 副本上的无盘复制
- Redis-benchmark支持集群+Redis-cli的改进
- 系统支持重写
- Redis Cluster代理与Redis6一起发布(不同仓库)
- Redis 6发布了Disque模块(不同仓库)
如你所见,有很多比较大的改动,接下来我会选择其中几个进行介绍。
RESP3
10年之后,我们需要一个新的协议,我在这篇博客中进行了广泛的讨论:http://antirez.com/news/125,但我随后改变了主意,所以RESP3在Redis6中是“选择加入”。连接最开始是RESP2模式,只有当你使用新的HELLO命令握手时,你才会进入新的协议模式。
我们为什么需要一个新的协议呢?因为旧的语义不够清晰。RESP3中还有一些其他功能,但主要思想是能够直接从Redis返回复杂数据类型,而客户端不必知道要转换为哪种类型的数组,或者返回的数字是否能够转换成布尔值等等。
由于RESP3不是仅有的协议,所以它的使用速度比预期要慢一些,但这也许不是一件坏事,因为这样我们就有足够的时间来进行适应和调整。
ACLs
对Redis ACLs最好对介绍就是ACL文档本身(https://redis.io/topics/acl),即使它可能需要进行一些更新以匹配最近对修改。我在这里更想讨论一下使用它的动机。Redis需要ACLs是因为人们需要在更广泛的使用ACLs,以达到更好的控制客户端可以做的某些操作。另一个增加ACLs的主要原因是进行隔离,以保护数据免受应用程序错误的侵害。如果你的工作节点只能做BRPOPLPUSH操作,那么新的开发人员使用FLUSHALL的机会就比较少,也能够降低生产环境执行FLUSHALL的可能性。
在Redis中ACLs的操作都是免费的,因为如果你不用它们,性能上就不会受影响,毕竟这部分开销无法衡量。我想这是最好的处理方法了,值得一提的是,我们现在为ACL提供了Redis模块接口,因此你可以编写自定义身份验证方法。
SSL
现在是2019年,马上要到2020年了,因此有一些新的规则。唯一的问题就是如何正确执行,正确执行的前提是错误执行并理解其局限性,然后对Redis连接进行抽象以正确执行。这项工作是在完全没有我的帮助下进行的,这也体现了Redis开发过程的改变。
客户端缓存
关于客户端缓存,我写了一篇博客(http://antirez.com/news/130),然而我认为这是Redis6最不成熟的功能。没错,服务器可以协助你在客户端缓存,这看起来很酷,但我想要在Redis6 GA版本出来之前对这个功能进行进一步优化。尤其是增加一种新的模式,在这个模式下,服务器不维护客户端的状态或者尽量少的维护客户端的状态,更多使用消息进行交互。而且,现在无法将某些“cache slots”的过期消息合并成一个。这是一个不错的想法,我们将在一月份着重做这部分功能。
Disque成为一个模块
最终,我做到了(https://github.com/antirez/disque-module),我对这个结果非常满意。
Disque作为一个模块确实显示的Redis模块系统的强大。集群消息总线API,能够阻止和恢复客户端,计时器,模块私有数据的AOF和RDB控制。如果你还不知道什么是Disque,可以去看一下这个仓库的README。
集群代理
我的同事Fabio在这个工作中花费了几个月的时间:https://github.com/artix75/redis-cluster-proxy
我想看到这个功能已经很多年了,当主题是Redis集群支持时,客户端的需要进行的操作总是很分散,现在我们有了代理(还在进行中),就可以做很多有趣的事情了。最主要的功能是为客户端抽象Redis集群,就像它们正在与单个实例通信一样。另一个功能就是至少在简单且客户端仅使用简单命令和功能时执行多路复用。当要阻止或执行事务时,代理为客户端分配一组不同的连接。代理也是完全线程级的,所以让大部分CPU时间花在I/O上,这是一种最大化CPU使用率的好方法。你可以查看README文件,然后试一试这个功能。
Modules
Redis6的模块API完全是一个新的等级了。这是Redis发展最快的部分之一,因为我们从最开始就使用模块系统来开发非常复杂的东西,而不仅仅是琐碎的示例。前端时间,我启动了Disque端口,这也促使我为模块系统带来新功能。现在,你可以把Redis看成一个框架,可以讲系统作为模块进行编写,避免从头造*,同时也可以获得BSD许可,Redis实际上是一个可以用来编写系统的开放平台。
内部
Redis内部有非常多的优化:复制命令的方式发生了很大变化,过期使用了另一种算法,该算法更快且缓存更明显。
Status和ETA
现在我们已经有了RC1,我希望在3月末,最晚5月,你就可以看到GA版本准备就绪。
现在,Redis6绝对是可测试的,并且遇到错误的机会很小。但它包含了大量的代码更改,并且新功能由新的代码组成,也从没有人在生产环境中运行过这些代码。所以如果你找到了bug,请以最好的方式描述一下发生的情况并报告给我们。
感谢所有人为该版本做出贡献的人和在接下来几个月中帮助我们维护它处于稳定状态的人。
啊,我差点忘了,这是第6版的LOLWUT命令交互图:
每次运行都会随机生成不同的景观。