文章目录
- Redis 7.0 RC1
- 新特性
- Redis命令变化
- 用户相关
- 管理相关
- 命令返回值变化
- 值得注意的变更
- 改进与优化
- 安全性
- 性能和资源利用率
- 平台/工具链支持相关
- 其他
- ACL工具变化
- 配置项变更
- INFO字段和自检命令变化
Redis 7.0 RC1
Redis 7.0包含一系列面向用户的新特性、显著的性能提升和诸多其他改进、也包含一些对旧版本向后兼容性存在潜在破坏的改变,我们强烈建议用户在升级之前认真检阅发行笔记,用户需要特别关心的有以下几点:
- Redis 7将以在一个文件夹下、多个文件的方式存储AOF文件;
- Redis 7将RDB文件的版本升级为10,与之前的RDB文件版本不再兼容;
- 当加载较旧的RDB文件时,Redis 7会即时地将ziplist编码的key转为listpacks,这种转换适用于从磁盘加载文件或从master节点复制文件,当然也会略微增加加载时间;
- 参阅后面提到的破坏性变更的部分。
新特性
-
Redis Functions:Redis函数,一种新的通过服务端脚本扩展Redis的方式,函数与数据本身一起存储。函数还被持久化到AOF文件,并从主文件复制到副本,因此它们与数据本身一样持久,见:/topics/functions-intro;
-
ACL改进:支持基于key的细粒度的权限,允许用户支持多个带有选择器的命令规则集,见:/topics/acl#key-permissions 和/topics/acl#selectors;
-
sharded-pubsub:分片发布/订阅支持,之前消息会在整个集群中广播,而与订阅特定频道/模式无关。发布行为会连接到集群中的所有节点,而不用客户端连接到所有节点都会收到订阅消息。见 /topics/pubsub#sharded-pubsub
-
在大多数情况下把子命令当作一类命令处理(Treat subcommands as commands)(影响 ACL类别、INFO 命令统计等)
-
文档更新:提供命令的元数据和文档,文档更完善,见/commands/command-docs 、/topics/command-tips
-
Command key-specs:为客户端定位key参数和读/写目的提供一种更好的方式;
-
多部分 AOF 机制避免了 AOF 重写的开销;
-
集群支持主机名配置,而不仅仅是 IP 地址;
-
客户端驱逐策略:改进了对网络缓冲区消耗的内存的管理,并且提供一个选项,当总内存超过限制时,剔除对应的客户端;
-
提供一种断开集群总线连接的机制,来防止不受控制的缓冲区增长;
-
AOF:增加时间戳和对基于时间点恢复的支持;
-
Lua:支持 EVAL 脚本中的函数标志;
-
Lua:支持 Verbatim 和 Big-Number 类型的 RESP3 回复;
-
Lua:可以通过 redis.REDIS_VERSION、redis.REDIS_VERSION_NUM来获取 Redis 版本。
Redis命令变化
详情查阅:/commands/
用户相关
-
新增命令:
-
ZMPOP:ZMPOP numkeys key [key …] MIN | MAX [COUNT count] 从提供的key列表对应的第一个非空zset中,pop一个或多个元素(member-score pairs)
-
BZMPOP:ZMPOP的阻塞形式。
-
LMPOP:LMPOP numkeys key [key …] LEFT | RIGHT [COUNT count] 从提供的key列表对应的第一个非空list中,pop一个或多个元素
-
BLMPOP:LMPOP的阻塞形式
-
SINTERCARD:SINTERCARD numkeys key [key …] [LIMIT limit] 此命令类似于SINTER,但它不返回结果集,只返回结果的基数。返回由所有给定集合的交集产生的集合的基数。
-
ZINTERCARD:ZINTERCARD numkeys key [key …] [LIMIT limit] 此命令和ZINTER类似,但它不返回结果集,只返回结果的基数。
-
SPUBLISH:SPUBLISH channel message 将消息发布到指定的分片channel。
-
SSUBSCRIBE:SSUBSCRIBE channel [channel …] 将客户端订阅到指定的分片channel。
-
SUNSUBSCRIBE:SUNSUBSCRIBE [channel [channel …]] 从给定的分片channel取消客户端订阅,如果没有,则从所有channel取消客户端订阅。
-
PUBSUB SHARDCHANNELS:PUBSUB SHARDCHANNELS [pattern] 列出当前活动的分片channel。
-
PUBSUB SHARDNUMSUB:PUBSUB SHARDNUMSUB [channel [channel …]] 返回指定分片channel的订阅数,在没有channel参数的情况下调用此命令是有效的,在这种情况下,它只会返回一个空列表。
-
EXPIRETIME:EXPIRETIME key 返回给定key过期的绝对Unix时间戳(自1970年1月1日起),以秒为单位。
-
PEXPIRETIME:PEXPIRETIME key 与EXPIRETIME具有相同的语义,但返回绝对Unix过期时间戳(以毫秒为单位,而不是以秒为单位)。
-
EVAL_RO:这是EVAL命令的只读形式,无法执行修改数据的命令(RO:Read-Only)。
-
EVALSHA_RO:EVALSHA命令的只读形式。
-
FUNCTION:函数命令的容器命令,使用FUNCTION HELP可以查看相关的命令
-
FCALL:调用一个方法
-
FCALL_RO:调用一个只读方法
-
-
命令变更:
-
EXPIRE 命令组支持 NX/XX/GT/LT 选项
- NX:key没有过期时间才可以设置过期时间
- XX:key已经存在过期时间才可以设置过期时间
- GT:新的过期时间大于当前的才设置
- LT:新的过期时间小于当前的才设置
-
SET 命令支持组合 NX 和 GET 标志:SET key value … NX GET
-
BITPOS, BITCOUNT 接受 BIT 索引
-
SORT_RO 命令在只读副本上运行
-
SHUTDOWN 支持参数 NOW、FORCE、ABORT
- NOW:跳过等待滞后的副本
- FORCE:忽略通常会阻止服务器退出的任何错误
- ABORT:取消正在进行的关机操作,并且不能与其他标志组合
-
CONFIG SET/GET 可以在一次调用中自动处理多个配置
-
QUIT 提升为真正的命令,HOST: 和 POST 从命令列表中降级
-
XADD 通过 -* 支持自动序列号
-
管理相关
-
新增命令:
-
COMMAND DOCS:返回有关命令的文档信息。默认情况下,回复包含服务器的所有命令。可以使用可选的命令名参数指定一个或多个命令的名称;
-
COMMAND LIST:返回一个服务端命令名称的数组
-
LATENCY HISTOGRAM:以直方图的形式为每个指定的命令名报告延迟的累积分布。如果未指定命令名,则将回复包含延迟信息的所有命令
-
CLUSTER LINKS:Redis集群中的每个节点都与集群中的每个对等方保持一对长时间存活的TCP链路:一个用于向对等方发送出站消息,另一个用于接收来自对等方的入站消息,CLUSTER LINKS将所有此类对等链接的信息输出为一个数组,其中每个数组元素都是一个映射,其中包含单个链接的属性及其值。
-
CLUSTER DELSLOTSRANGE:根据指定范围删除集群中node上的槽位,参数为槽位范围列表,也就是说可以同时操作多个槽位范围,下同
-
CLUSTER ADDSLOTSRANGE:在node上添加指定范围的槽位
-
CLIENT NO-EVICT:参数为ON或者OFF,当打开并且配置了客户端驱逐时,及时当前客户端达到了所配置的客户端驱逐条件,也不会被驱逐,关闭则正常执行驱逐流程
-
ACL DRYRUN:模拟指定用户执行给定的命令。此命令可用于测试给定用户的权限而无需启用该用户,且避免运行该命令的副作用
-
-
命令变更:
- COMMAND INFO:可以没有参数,返回所有命令的信息
- SLOWLOG GET:支持传入-1,获取所有条目
命令返回值变化
- COMMAND 和 COMMAND INFO 扩展了提示、关键字和子命令
- ACL CAT、COMMAND LIST 列出子命令
- OBJECT ENCODING 返回 listpack 而不是 ziplist
- 集群分片支持主机名
- COMMAND 命令:添加blocking和module标志
- MODULE LIST 回复包括路径和参数
值得注意的变更
- 将bind参数修改为非默认值,将不再隐式禁用protected-mode
- 删除EVAL脚本逐字复制、传播和删除执行逻辑
- ACL:发布/订阅频道默认被阻塞 (acl-pubsub-default=resetchannels)
- SCRIPT LOAD 和 SCRIPT FLUSH 不再传播到副本/AOF
- ACL:在启动文件和命令行参数中声明重复的 ACL 用户将导致错误(之前最后一个声明将覆盖其他声明)
- 主从复制:TTL 总是被复制为绝对(非相对)毫秒时间戳
- 在可写副本上,对于过期的key,处理多键命令会先触发过期逻辑
- CONFIG SET maxmemory 在开始驱逐逻辑之前返回
- AOF: 新的 Multi-Part 机制将数据作为一组多个文件的集合存储在指定文件夹中
- 删除STRALGO命令,保留LCS命令,但仅作为作用于key的独立命令
- 移除gopher协议支持
- 为了更好的安全性,默认禁用MODULE和DEBUG命令
- 拒绝 MULTI/EXEC 事务中的快照创建和其他管理命令
- 当replica-serve-stale-data=no时,PING现在被-MASTERDOWN拒绝
- ACL GETUSER的返回结果现在对keys和channels使用ACL语法
- COMMAND的返回结果删除
random
和sort-for-scripts
标志,现在作为命令提示的一部分 - 对不存在的列表,带计数的 LPOP/RPOP 返回空数组
- INFO commandstats现在可展示每个子命令的统计信息
- ZPOPMIN/ZPOPMAX命令用在非zset类型、count为0时,会报错
- LPOP/RPOP用于在count为0时返回错误
- CONFIG GET bind 返回当前的有效值,即使使用了隐式的默认值
- CONFIG REWRITE命令将模块作为loadmodule选项重写到配置文件中,以防有人在运行时使用模块加载或卸载命令
- 配置项repl-diskless-sync现在默认是yes
- 关闭时,Redis可以选择等待副本在复制链路上赶上
- 大多数命令,如CONFIG SET, REWRITE, RESETSTAT允许在加载时执行
- READONLY 和 READWRITE允许在加载时或者旧的副本上执行
- 修复SELECT, WAIT, ROLE, LASTSAVE, READONLY, READWRITE, ASKING等命令的ACL分类
- 使在未经认证的连接上,现在也允许RESET
- SCRIPT LOAD允许在旧的副本上执行
改进与优化
安全性
- 敏感的命令和配置默认被禁用了;
- 更改配置项 bind 和保护模式的安全性;
- Sentinel模式下避免记录auth-pass值;
- Redis-cli:敏感命令绕过历史文件。
性能和资源利用率
- 集群模式下内存消耗和延迟有显著改善;
- 在使用多个哈希或zset键的情况下,可以显著节省内存;
- 复制积压和副本使用一个全局共享复制缓冲区;
- 显著减少了copy-on-write的内存开销;
- 释放集群发送缓冲区中未使用的容量;
- 充分利用客户端结构内存进行回复缓冲;
- 在Hash、List、Zset中用listpack替换ziplist;
- List类型可以支持存储4GB以上的元素;
- 按模块为阻塞的客户端重用临时客户端对象;
- 移除命令参数计数限制,动态增长argv缓冲区;
- 优化列表类型操作;
- 改进fsync,避免对磁盘的大量写入;
- BITSET 和 BITFIELD SET仅在值实际更改时传播;
- 改善客户端被模块计时器解除阻塞时的延迟;
平台/工具链支持相关
- jemalloc 升级到 5.2.1
- 修复NetBSD和OpenBSD上的RSS指标;
- 检查macOS、FreeBSD和OpenBSD上的somaxconn(系统中每一个端口最大的监听队列的长度)系统内核参数设置;
- MacOS上更好的fsync,提高停电安全性。
其他
- master重启后,支持部分同步;
- redis启动时,即使没有加载文件,也会创建一个基础的AOF文件;
- 在repl-diskless-load=swapdb期间,副本继续提供数据,以获得更好的可用性;
ACL工具变化
- redis-cli --json:增加 -2 选项;
- redis-cli --scan:添加休眠间隔选项;
- redis-cli --replica:跳过 RDB 生成;
- redis-cli --functions-rdb:仅生成带函数的 RDB;
- redis-cli -X:从标准输入中获取任意参数;
- redis-benchmark -x:从标准输入获取参数;
- redis-benchmark:添加 URI 支持;
- redis-cli monitor和pubsub 可以使用 Ctrl+C 中止,保持 cli 活动。
配置项变更
-
CONFIG SET/GET 命令在一次调用中可以处理多个配置;
-
对于include配置项,支持全局模式匹配;
-
shutdown-timeout:关闭时等待复制副本的最长时间,默认10秒、未启用,仅当实例有副本时才适用;
-
maxmemory-clients:配置允许限制所有客户端的总内存使用量,默认未启用,可以配置实际的使用量(如1g),也可以配置相对于配置项maxmemory的百分比(1%~100%),当客户端连接占用内存超过改配置时,服务端会执行剔除客户端连接操作,尝试优先剔除内存占用最高的,这也成为客户端驱逐(client eviction)策略;
-
cluster-port:群集端口是群集总线将侦听入站连接的端口。默认为0、未启用,当设置为默认值0时,它将绑定到命令端口 +10000。设置此值需要您在执行cluster meet时指定群集总线端口;
-
bind-source-addr:默认情况下,传出连接(从副本到主机、从Sentinel到实例、集群总线等)不绑定到特定的本地地址。在大多数情况下,这意味着操作系统将根据路由和连接所通过的接口来处理。使用bind source addr可以配置要绑定到的特定地址,这也可能会影响连接的路由方式,默认未启用。
-
busy-reply-threshold:单位毫秒,默认值为5000,即5秒、未启用,和lua-time-limit功能相同,配置在Redis开始处理或拒绝其他客户端之前,EVAL脚本、函数以及某些情况下模块命令的最长时间;
-
repl-diskless-sync-max-replicas:如果启用无盘复制时存在延迟,则如果预期已连接的复制副本数量达到最大,则可以在达到最大延迟之前启动复制。默认值为0、启用,表示未定义最大值;
-
cluster-announce-hostname:集群可以使用此配置配置其公布的主机名,默认为空字符,未启用;
-
cluster-preferred-endpoint-type:集群公布客户端连接的方式,该配置有三个选项:‘ip’、‘hostname’、 ‘unknown-endpoint’,默认为ip,未启用;
-
latency-tracking:Redis 扩展的延迟监控可跟踪每个命令的延迟,延迟的开销非常小,并可通过INFO latencystats命令导出百分比分布,以及通过LATENCY命令导出直方图。默认为yes、未启用。
-
latency-tracking-info-percentiles:设置导出的数据百分比点,默认为:50 99 99.9;
-
cluster-allow-pubsublocal-when-down:这个配置项在最新的(7.0-rc3)配置文件中没找到,但是有cluster-allow-pubsubshard-when-down,默认为yes、未启用,当设置为yes时,允许节点在集群处于down状态时为pubsub shard流量提供服务,前提是它认为自己拥有这些槽位,这对于即使集群全局不处于稳定状态,应用程序仍想要使用pubsub功能会很有用;
-
cluster-link-sendbuf-limit:集群链路发送缓冲限制,是单个群集总线链路发送缓冲区内存使用量的限制,以字节为单位。如果超过此限制,群集链接将被释放。这主要是为了防止发送缓冲区在指向慢速对等方的链接上无限增长(例如,PubSub消息被堆积),默认为0、未启用,此限制处于禁用状态,当INFO中’mem_cluster_links’字段或’cluster links’命令输出中的’send buffer allocated’条目持续增加时,启用此限制;
-
旧的ziplist相关配置改成了对应的listpack:list-max-listpack-*, hash-max-listpack-*, zset-max-listpack-* 。
INFO字段和自检命令变化
-
INFO:
-
新的选项INFO latencystats,查看命令的延迟统计信息;
-
新的指标项
-
total_active_defrag_time:内存碎片超过限制的总时间(以毫秒为单位)
-
current_active_defrag_time:自上次内存碎片超过限制以来经过的时间(以毫秒为单位)
-
total_eviction_exceeded_time:自服务器启动以来,已使用内存大于maxmemory的总时间
-
current_eviction_exceeded_time:自上次使用的内存超过maxmemory以来经过的时间,以毫秒为单位
-
evicted_clients:由于maxmemory-clients限制而被逐出的客户端数
-
mem_cluster_links:启用群集模式时,链接到群集总线上的对等方所使用的内存
-
total_cluster_links_buffer_limit_exceeded:这个在官方文档中未查询到,待实践
-
current_cow_peak:运行子fork时,写时复制内存的峰值大小(字节)
-
-
移除了aof_rewrite_buffer_length;
-
显示RESP版本信息;
-
-
INFO MEMORY:
- 对Functions和EVAL脚本显示单独的内存使用;
- 添加mem_total_replication_buffers:复制缓冲区消耗的总内存
- 更改mem_clients_slaves的含义:副本客户端使用的内存——从Redis 7.0开始,副本缓冲区与复制积压共享内存,因此当副本未触发内存使用增加时,此字段可以显示0
-
MEMORY STATS:在群集模式下报告插槽到key的映射大小;
-
CLIENT LIST:
- 增加tot-mem:此客户端在其各种缓冲区中消耗的总内存
- multi-mem:缓冲的多个命令所消耗的内存
- 显示RESP版本信息;
-
SENTINEL INFO:(官方文档中未找到该命令)
- 增加tilt_mode_since:
-
LATENCY:追踪module-acquire-GIL延迟。
参考:
/redis/redis/7.0/00-RELEASENOTES
…
/redis/redis/blob/unstable/
…
/commands/