文章目录

  • 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文件,并从主文件复制到副本,因此它们与数据本身一样持久,见:https://redis.io/topics/functions-intro;

  • ACL改进:支持基于key的细粒度的权限,允许用户支持多个带有选择器的命令规则集,见:https://redis.io/topics/acl#key-permissions 和https://redis.io/topics/acl#selectors;

  • sharded-pubsub:分片发布/订阅支持,之前消息会在整个集群中广播,而与订阅特定频道/模式无关。发布行为会连接到集群中的所有节点,而不用客户端连接到所有节点都会收到订阅消息。见 https://redis.io/topics/pubsub#sharded-pubsub

  • 在大多数情况下把子命令当作一类命令处理(Treat subcommands as commands)(影响 ACL类别、INFO 命令统计等)

  • 文档更新:提供命令的元数据和文档,文档更完善,见https://redis.io/commands/command-docs 、https://redis.io/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命令变化

详情查阅:https://redis.io/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的返回结果删除randomsort-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延迟。

参考:

https://raw.githubusercontent.com/redis/redis/7.0/00-RELEASENOTES

https://github.com/redis/redis/blob/unstable/redis.conf

https://redis.io/commands/

【Redis】Redis7.0新特性汇总(详细)相关推荐

  1. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

  2. Redis 6.0 新特性,多线程连环 13 问!

    导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题? ...

  3. Redis 6.0 新特性:多线程连环 13 问!

    来源 | 码大叔 责编 | Carol 封图 | CSDN付费下载自视觉中国 支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后 ...

  4. Redis 6.0 新特性-多线程连环 13 问!

    Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...

  5. Redis 6.0 新特性 ACL 介绍

    Redis 6.0 新特性 ACL 介绍 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实 ...

  6. Redis 6.0新特性——ACLs

    简介 Redis在6版本之前是没有权限的概念的,所以所有连接的客户端都可以对Redis里面的数据进行操作,也可以使用所有高危命令,这样就可能存在Redis直接down掉或者数据被全部清空的情况. 当执 ...

  7. 【Redis】 - Redis 6.0 新特性之客户端缓存

    Redis 6.0 新特性之客户端缓存 1. 为什么需要客户端缓存 1.1 低延迟和大规模提供数据服务 1.2 其他 cache 层 2. Redis 中的客户端缓存 2.1 什么样的数据集应该被客户 ...

  8. Redis 6.0 新特性概览

    摘要:Redis 6.0 特性 点击阅读原文,提升阅读体验:https://www.modb.pro/db/22840?cyn 前言 Redis 6 RC2 于今年3月5号Release,预计今年4. ...

  9. Redis 6.0 新特性-多线程连环13问

    支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...

最新文章

  1. “make -n”和 “+command”的解释
  2. 用火狐录制脚本为空_功能测试——链接测试amp;脚本功能
  3. 录制完脚本怎么做接口自动化测试_快速构建轻量级接口自动化框架
  4. android slidingmenu框架,常用框架之SlidingMenu的使用(基于AndroidStudio)
  5. 创建Struts 2简单应用的流程
  6. JS Location
  7. 李雅普诺夫(第二方法)稳定性分析+例题
  8. 计算机232接口接线,RS232串口的简单介绍_RS232接线方法及电气特性
  9. C/C++学习路线总结与分享
  10. win10系统找不到指定文件怎么办?10种解决方法帮你解决
  11. 【Java 代码实例 14】BeanUtils用法详解,附源码分析
  12. 微信小程序初始界面设置密码
  13. 互联网IT行业岗位分析,程序员、CTO……都是什么?
  14. GPU深度学习训练时出现train_loss一直不变且val_loss不变的问题
  15. OpenCV图像处理知识点梳理
  16. AD10 PCB文件统一设置字体大小(默认字体大小)
  17. 手机拍照翻译成中文怎么做?分享两个手机翻译小妙招
  18. Java发送email邮件
  19. JS中 Object.assign()用法
  20. 国内外主流的 Git 代码托管网站

热门文章

  1. taro 的项目结构_Taro小程序,从0到1架构项目,打造自己的完美脚手架。
  2. DNS域名解析服务1(高速缓存dns,dns正向解析,dns正向轮询解析,dns反向解析,dns双向解析)
  3. 软件安装管家【软件目录】
  4. 文本相似度易语言查询代码
  5. tomcat中配置二级域名
  6. Linux原理及应用
  7. ODBC 和OLEDB
  8. 数学通道的应用(十三)-涡轮增压发动机空气流量实际值
  9. 名帖127 文徵明 小楷《盘谷叙》
  10. 印制线路板的制造原理简介