天天看点

Redis6.2版本特性介绍Introduction to the Redis 6.2 release

Introduction to the Redis 6.2 release

This release is the first significant Redis release managed by the core team

under the new project governance model.

Redis 6.2 includes many new commands and improvements, but no big features. It

mainly makes Redis more complete and addresses issues that have been requested

by many users frequently or for a long time.

Redis 6.2包含很多新命令和提升,但是没有大的特性功能。主要是让Redis更完整,并且解决用户常提到的和已经存在很长时间的问题。

Many of these changes were not eligible for 6.0.x for several reasons:

很多改动不适合6.0.x版本,因为:
  1. They are not backward compatible, which is always the case with new or

    extended commands (that cannot be replicated to an older replica).

    因为新的命令或者扩展的命令是不可回退的(不可复制到旧的副本上)。
  2. They require a longer release-candidate test cycle.
    因为它们需要一个更长发布测试的周期。

Here is a comprehensive list of changes in this release compared to 6.0.9,

each one includes the PR number that added it, so you can get more details

at https://github.com/redis/redis/pull/

以下是全部更新列表

New commands / args:

  • Add SMISMEMBER command that checks multiple members (#7615)
  • Add ZMSCORE command that returns an array of scores (#7593)
  • Add LMOVE and BLMOVE commands that pop and push arbitrarily (#6929)
  • Add RESET command that resets client connection state (#7982)
  • Add COPY command that copies keys (#7953)
  • Add ZDIFF and ZDIFFSTORE commands (#7961)
  • Add ZINTER and ZUNION commands (#7794)
  • Add GEOSEARCH/GEOSEARCHSTORE commands for bounding box spatial queries (#8094)
  • Add GET parameter to SET command, for more powerful GETSET (#7852)
  • Add exclusive range query to XPENDING (#8130)
  • Add exclusive range query to X[REV]RANGE (#8072)
  • Add GT and LT options to ZADD for conditional score updates (#7818)
  • Add CLIENT INFO and CLIENT LIST for specific ids (#8113)
  • Add IDLE argument to XPENDING command (#7972)
  • Add local address to CLIENT LIST, and a CLIENT KILL filter. (#7913)
  • Add NOMKSTREAM option to XADD command (#7910)
  • Add command introspection to Sentinel (#7940)
  • Add SENTINEL MYID subcommand (#7858)
新命令 / 参数:
  • 新增SMISMEMBER命令批量检查成员。
  • 新增ZMSCORE命令返回分数数组
  • 新增 LMOVE 和 BLMOVE命令来任意存取元素
  • 新增 RESET 命令重置客户端连接状态
  • 新增 COPY 命令复制键
  • 新增 ZDIFF 和 ZDIFFSTORE 命令
  • 新增 ZINTER 和 ZUNION 命令
  • 新增 GEOSEARCH/GEOSEARCHSTORE 命令用于绑定矩形查询
  • 新增 GET 命令的参数到 SET 命令,以实现更强大的 GETSET
  • 新增 XPENDING 命令的独占范围查询
  • 新增 X[REV]RANGE 命令的独占范围查询
  • 新增 ZADD 命令的 GT 和 LT 选项以实现条件分数更新
  • 新增 CLIENT INFO 和 CLIENT LIST 命令用于指定 id
  • 新增 IDLE 参数到 XPENDING 命令
  • 新增本地地址到 CLIENT LIST,并且添加 CLIENT KILL 筛选器
  • 新增 NOMKSTREAM 参数到 XADD 命令
  • 新增introduction命令到Sentinel实例
  • 新增 SENTINEL MYID 子命令

New features:

  • Dump payload sanitization: prevent corrupt payload causing crashes (#7807)

    Has flags to enable full O(N) validation (disabled by default).

  • ACL patterns for Pub/Sub channels (#7993)
  • Support ACL for Sentinel mode (#7888)
  • Support getting configuration from both stdin and file at the same time (#7893)

    Lets you avoid storing secrets on the disk.

新特性:
  • 导出和载入数据的安全性: 防止损坏数据导致崩溃。

    有标记来开启 全量 O(N)校验(默认是关闭的)

  • Pub/Sub频道支持 ACL规则
  • Sentinel模式支持 ACL
  • 同时支持从标准输入流和配置文件获取配置,可以避免密钥存储到磁盘上。

New features in CLI tools:

  • redis-cli RESP3 push support (#7609)
  • redis-cli cluster import support source and target that require auth (#7994)
  • redis-cli URIs able to provide user name in addition to password (#8048)
  • redis-cli/redis-benchmark allow specifying the prefered ciphers/ciphersuites (#8005)
  • redis-cli add -e option to exit with code when command execution fails (#8136)
客户端工具新特性:
  • redis-cli RESP3协议推送支持
  • redis-cli cluster集群导入支持源和目标支持密码
  • redis-cli URIs 除密码外还可以提供用户名
  • redis-cli/redis-benchmark支持指定首选密码
  • redis-cli 增加 -e选项来在命令执行失败退出时返回的代码

Command behavior changes:

  • EXISTS should not alter LRU (#8016)

    In Redis 5.0 and 6.0 it would have touched the LRU/LFU of the key.

  • OBJECT should not reveal logically expired keys (#8016)

    Will now behave the same TYPE or any other non-DEBUG command.

  • Improve db id range check for SELECT and MOVE (#8085)

    Changes the error message text on a wrong db index.

  • Modify AUTH / HELLO error message (#7648)

    Changes the error message text when the user isn’t found or is disabled.

  • BITOPS length limited to proto_max_bulk_len rather than 512MB (#8096)

    The limit is now configurable like in SETRANGE, and APPEND.

  • GEORADIUS[BYMEMBER] can fail with -OOM if Redis is over the memory limit (#8107)
命令行行为改变:
  • EXISTS不会改变LRU(#8016)

    在Redis 5.0和6.0中,它会改变LRU/LFU的键。

  • OBJECT不会暴露逻辑过期的键(#8016)

    TYPE或任何其他非DEBUG命令也一样。

  • 提升 SELECT 和MOVE命令的数据库id的检查范围

    调整了数据库索引错误返回的错误信息

  • 调整 AUTH / HELLO 的错误信息

    修改了用户不存在或用户被禁用后的错误信息提示

  • BITOPS 长度限制为proto_max_bulk_len而不是512MB(#8096)

    长度限制现在是可配置的,和SETRANGE、APPEND的一样。

  • GEORADIUS[BYMEMBER] 可以带-OOM参数失败,如果Redis出现内存超限的情况。

Other behavior changes:

  • Optionally (default) fail to start if requested bind address is not available (#7936)

    If you rely on Redis starting successfully even if one of the bind addresses

    is not available, you’ll need to tune the new config.

  • Limit the main db dictionaries expansion to prevent key eviction (#7954)

    In the past big dictionary rehashing could result in massive data eviction.

    Now this rehashing is delayed (up to a limit), which can result in performance

    loss due to hash collisions.

  • CONFIG REWRITE is atomic and safer, but requires write access to the config file’s folder (#7824, #8051)

    This change was already present in 6.0.9, but was missing from the release

    notes.

  • A new incremental eviction mechanism that reduces latency on eviction spikes (#7653)

    In pathological cases this can cause memory to grow uncontrolled and may require

    specific tuning.

  • Not resetting “save” config when Redis is started with command line arguments. (#7092)

    In case you provide command line arguments without “save” and count on it

    being disabled, Now the defaults “save” config will kick in.

  • Update memory metrics for INFO during loading (#7690)
  • When “supervised” config is enabled, it takes precedence over “daemonize”. (#8036)
  • Assertion and panic, print crash log without generating SIGSEGV (#7585)
  • Added crash log report on SIGABRT, instead of silently exiting (#8004)
  • Disable THP (Transparent Huge Pages) if enabled (#7381)

    If you deliberately enabled it, you’ll need to config Redis to keep it.

其他行为变更:
  • 选择性地(默认)失败启动,如果请求的绑定地址不可用(#7936)

    如果您依赖Redis启动成功,即使一个绑定地址不可用,您需要调整新的配置。

  • 限制主db字典扩展以防止键退出(#7954)

    在过去的时候,大字典重哈希可能导致大量数据退出。

    现在,这个rehash的延迟(最多到一个限制),可能导致性能下降,因为哈希冲突。

  • CONFIG REWRITE是原子的和安全的,但是需要写入配置文件的文件夹(#7824,#8051)

    这个功能在6.0.9已经上线了,但是在版本说明中没有体现。

  • 增加一个增量eviction机制,减少eviction峰值的延迟(#7653)

    在某些场景这可能会导致内存增长不受控制,可能需要特定的调整。

  • 当Redis使用命令行参数启动时,不重置“save”配置(#7092)

    在您使用命令行参数时,如果未“save”的配置,现在默认的“save”配置将被启用。

  • 在实例Loading时会更新INFO命令的内存指标(#7690)
  • 当“supervised”配置启用时,它优先于“daemonize”。(#8036)
  • 断言和panic,打印crash日志而不生成SIGSEGV(#7585)
  • 在SIGABRT时增加崩溃日志报告,而不是静默退出。
  • 禁用 THP (大页配置)如果启用了。

    如果您手动设置启用了大页配置,则需要修改Redis配置来保持。

Bug fixes:

  • Handle output buffer limits for module blocked clients (#8141)

    Could result in a module sending reply to a blocked client to go beyond the

    limit.

  • Fix setproctitle related crashes. (#8150, #8088)

    Caused various crashes on startup, mainly on Apple M1 chips or under

    instrumentation.

  • A module doing RM_Call could cause replicas to get nested MULTI (#8097).
  • Backup/restore cluster mode keys to slots map for repl-diskless-load=swapdb (#8108)

    In cluster mode with repl-diskless-load, when loading failed, slot map

    wouldn’t have been restored.

  • Fix oom-score-adj-values range, and bug when used in config file (#8046)

    Enabling setting this in the config file in a line after enabling it, would

    have been buggy.

  • Reset average ttl when empty databases (#8106)

    Just causing misleading metric in INFO

  • Disable rehash when Redis has child process (#8007)

    This could have caused excessive CoW during BGSAVE, replication or AOFRW.

  • Further improved ACL algorithm for picking categories (#7966)

    Output of ACL GETUSER is now more similar to the one provided by ACL SETUSER.

  • Fix bug with module GIL being released prematurely (#8061)

    Could in theory (and rarely) cause multi-threaded modules to corrupt memory.

  • Fix cluster redirect for module command with no firstkey. (#7539)
  • Reduce effect of client tracking causing feedback loop in key eviction (#8100)
  • Kill disk-based fork child when all replicas drop and ‘save’ is not enabled (#7819)
  • Rewritten commands (modified for propagation) are logged as their original command (#8006)
  • Fix cluster access to unaligned memory (SIGBUS on old ARM) #7958
  • If diskless repl child is killed, make sure to reap the child pid (#7742)
  • Broadcast a PONG message when slot’s migration is over, may reduce MOVED responses (#7571)
问题修复:
  • 处理输出缓冲区限制的模块阻塞客户端(#8141)

    可能导致模块向阻塞客户端发送回复超过限制。

  • 修复setproctitle(设置进程名称python操作)相关的崩溃。(#8150,#8088)

    启动时各种崩溃,主要是在Apple M1芯片或平台。

  • 一个模块执行RM_Call操作时可能导致副本实例嵌套MULTI(#8097)
  • 在repl-diskless-load=swapdb时,将备份/还原集群模式的键到槽的映射#8108)

    在集群模式下使用无盘加载时repl-diskless-load,当加载失败时,槽映射不会被恢复。

  • 修复oom-score-adj-values范围,以及在配置文件中使用时出现的bug(#8046)

    在配置文件中设置这个配置以后启用会出现问题。

  • 当清空的数据库时重置平均ttl(#8106)

    会导致在INFO命令中出现不可预料的指标

  • 禁用rehash,当Redis有子进程时(#8007)

    这可能导致在BGSAVE,主从复制或AOFRW时出现过度CoW(Copy on Write)

  • 进一步改进了用于选择类别的ACL算法

    现在,ACL Getuser的输出与ACL Setuser提供的输出更相似。

  • 修复GIL模块过早释放的问题

    理论上(极少)会导致多线程模块损坏内存的问题。

  • 修复了无FirstKey的模块命令的集群重定向(#7539)
  • 降低在key移除时对客户端的反馈环节的影响。
  • 当所有的副本丢弃并且“save”没有启用时,磁盘基础的fork子进程将被杀死(#7819)
  • 重写的命令被记录为它的原始命令(#8006)
  • 修复集群访问不对齐内存问题(旧的ARM架构为SIGBUS)(#7958)
  • 如果无磁盘复制的子进程被杀死,确保能获取到子进程的id(#7742)
  • 当slot的迁移完成时,广播一个PONG消息,可以减少MOVED返回(#7571)

Other improvements:

  • TLS Support in redis-benchmark (#7959)
  • Accelerate diskless master connections, and general re-connections (#6271)
  • Run active defrag while blocked / loading (#7726)
  • Performance and memory reporting improvement - sds take control of its internal fragmentation (#7875)
  • Speedup cluster failover. (#7948)
其他改进
  • 在redis-benchmark支持TLS(#7959)
  • 加速无磁盘复制主连接,并且一般的重新连接(#6271)
  • 在阻塞或加载数据时运行主动碎片整理
  • 性能和内存使用情况的改进 - sds控制其内部分裂(#7875)

Platform / toolchain support related improvements:

  • Optionally (not by default) use H/W Monotonic clock for faster time sampling (#7644)
  • Remove the requirements for C11 and _Atomic supporting compiler (#7707)

    This would allow to more easily build and use Redis on older systems and compilers again.

  • Fix crash log registers output on ARM. (#8020)
  • Raspberry build fix. (#8095)
  • Setting process title support for Haiku. (#8060)
  • DragonFlyBSD RSS memory sampling support. (#8023)
平台/工具链支持相关改进
  • 可选的(非默认配置)使用H/W Monotonic时间采样(#7644)
  • 删除编译器对C11和_Atomic支持的的需求(#7707)

    这样可以更容易在旧系统和编译器上构建和使用Redis。

  • 修复ARM的崩溃日志输出。(#8020)
  • 树莓派系统编译修复。(#8095)
  • 设置进程标题支持Haiku(操作系统)。(#8060)
  • DragonFlyBSD RSS内存采样支持。(#8023)

New configuration options:

  • Enable configuring OpenSSL using the standard openssl.cnf (#8143)
  • oom-score-adj-values config can now take absolute values (besides relative ones) (#8046)
  • TLS: Add different client cert support. (#8076)
  • Note that a few other changes listed above added their config options.
新配置选项:
  • 支持配置OpenSSL使用标准openssl.cnf(#8143)
  • oom-score-adj-values配置可以现在接受绝对值(除了相对值)(#8046)
  • TLS:添加不同的客户端证书支持。(#8076)
  • 上面列出的其他一些更改添加了其配置选项。

Info fields and introspection changes:

  • Add INFO fields to track diskless and disk-based replication progress (#7981)
  • Add INFO field for main thread cpu time, and scrape system time. (#8132)
  • Add total_forks to INFO STATS (#8155)
  • Add maxclients and cluster_connections to INFO CLIENTS (#7979)
  • Add tracking bcast flag and client redirection in client list (#7995)
  • Fixed INFO client_recent_max_input_buffer includes argv array (#8065, see #7874)
  • Note that a few other changes listed above added their info fields.
info字段和介绍改进:
  • 添加INFO字段跟踪磁盘无磁盘复制和磁盘复制进度(#7981)
  • 添加INFO字段主线程CPU时间,并采集系统时间。(#8132)
  • 添加total_forks字段到INFO STATS(#8155)
  • 添加maxclients和cluster_connections字段到INFO CLIENTS(#7979)
  • 添加跟踪bcast(广播地址)标志和客户端重定向信息到 client list(#7995)
  • 修复INFO client_recent_max_input_buffer包含argv数组的问题(#8065,参见#7874)
  • 上面列出的其他一些更改添加了其info字段。

Module API changes:

  • Add CTX_FLAGS_DENY_BLOCKING as a unified the way to know if blocking is allowed (#8025)
  • Add data type callbacks for lazy free effort, and unlink (#7912)
  • Add data type callback for COPY command (#8112)
  • Add callbacks for defrag support. (#8149)
  • Add module event for repl-diskless-load swapdb (#8153)
模块API改进:
  • 添加CTX_FLAGS_DENY_BLOCKING作为一个统一的方式来知道是否允许阻塞(#8025)
  • 惰性删除和unlink增加返回数据类型(#7912)
  • COPY命令增加数据类型返回(#8112)
  • 碎片整理增加数据类型返回(#8149)
  • 增加repl-diskless-load swapdb模块事件(#8153)

Module related fixes:

  • Moved RMAPI_FUNC_SUPPORTED so that it’s usable (#8037)
  • Improve timer accuracy (#7987)
  • Allow ‘\0’ inside of result of RM_CreateStringPrintf (#6260)
模块相关修复:
  • 移动RMAPI_FUNC_SUPPORTED,使其可用(#8037)
  • 提高定时器精度(#7987)
  • 允许“\0”在出现RM_CreateStringPrintf的结果中(#6260)

Redis 6.2 is mostly a strict superset of 6.0, you should not have any problem

upgrading your application from 6.0 to 6.2. However there are some small changes

of behavior listed above, please make sure you are not badly affected by any of

them.

Specifically these sections:

  • Command behavior changes
  • Other behavior changes