本文翻译自 https://github.com/redis/redis/releases, 由于译者才疏学浅,错漏之处敬请海涵。
Redis 7.0-rc1 新增加了几个面向用户的功能,并对性能和其他的方面做了优化。 有些修改可能破坏旧版本向后兼容性,请谨慎升级。
与之前版本有明显区别的,需要用户特别注意:
- Redis7 将 AOF 作为多个文件存储在一个文件夹中
- Redis7 对 RDB 文件使用了新版本格式(10),与旧版本不兼容
- Redis7 在加载旧的 RDB 文件时,会将 ziplist 编码的 key 转换为 listpack。 这通常发生在从 RDB 加载文件或者主从复制之间,并且会降低加载速度。
- 更多的改变可以查看有关重大更新的部分
如果对源代码感兴趣,可以参考 https://github.com/redis/redis/pull/ 查看对于 6.2 版本的代码修改。
新特性
- Redis Function: 使用服务器脚本扩展 Redis 的新方法,使得 Lua 脚本成为 Redis 的一部分,可以持久化,复制和命名称。可以参考文档 https://redis.io/topics/functions-intro
- ACL: V2版本————细粒度基于 key 的权限控制,通过 selector 支持多种命令规则。 可以参考文档 https://redis.io/topics/acl#key-permissions 和 https://redis.io/topics/acl#selectors
- Cluster: 支持用于特定节点的发布/订阅功能(比如分片)。可以参考文档 https://redis.io/topics/pubsub#sharded-pubsub
- 在大多数情况下,将子命令视为命令处理,这会影响 ACL 类别和 info 统计信息等。
- 命令元数据和文档更新: https://redis.io/commands/command-docs 和 https://redis.io/topics/command-tips
- Command key-specs: 更好的方法使得客户端定位 key 和进行读写目的 https://redis.io/topics/key-specs
- 使用 Multi-Part AOF 机制避免 AOF 重写机制的开销
- Cluster: 支持域名(之前仅支持ip)
- 改进了对网络缓冲区消耗的内存的管理,以及当总内存超过限制时剔除客户端的选项
- Cluster: 在集群链接缓冲区上加入内存管理机制
- AOF: 增加时间戳和对基于时间点恢复的支持
- Lua: 支持 EVAL 脚本中的函数标志
- Lua: RESP3 协议支持回复 Verbatim 和 Big-Number 类型
- Lua: 可以通过命令获取 Reids 的版本
新的命令和新的命令参数
- ZMPOP、BZMPOP命令
- LMPOP、BLMPOP 命令
- SINTERCARD、ZINTERCARD 命令
- SPUBLISH、SSUBSCRIBE、SUNSUBSCRIBE、PUBSUB、SHARDCHANNELS/SHARDNUMSUB 命令
- EXPIRETIME、PEXPIRETIME 命令
- EXPIRE 命令组支持 NX/XX/GT/LT 选项
- SET 命令支持组合 NX 和 GET 标志
- BITPOS, BITCOUNT 接受 BIT 索引
- SORT_RO 命令在只读副本上运行
- SHUTDOWN 支持参数 NOW、FORCE、ABORT
- EVAL_RO,EVALSHA_RO 命令变体,在只读副本上运行
- FUNCTION *,FCALL,FCALL_RO 命令,可以查看文档 https://redis.io/commands/function-load
- CONFIG SET/GET 可以在一次调用中自动处理多个配置
- QUIT 提升为真正的命令,HOST: 和 POST 从命令列表中降级
- XADD 通过 -* 支持自动序列号
新的管理和自省命令和命令新增加的参数
- COMMAND DOCS
- COMMAND LIST
- COMMAND INFO 接受子命令作为参数,也可以没有参数
- LATENCY HISTOGRAM
- CLUSTER LINKS
- CLUSTER DELSLOTSRANGE and CLUSTER ADDSLOTSRANGE
- CLIENT NO-EVICT
- ACL DRYRUN
- SLOWLOG GET 支持传入 -1 获取所有条目
命令回复值的增加条目
- COMMAND 和 COMMAND INFO 扩展了提示、关键字和子命令
- ACL CAT、COMMAND LIST 列出子命令
- OBJECT ENCODING 返回 listpack 而不是 ziplist
- 集群分片支持主机名
- COMMAND 命令:添加blocking和module标志
- MODULE LIST 回复包括路径和参数
重大变化和更新
- 将绑定参数修改为非默认值将不再隐式禁用保护模式
- 删除 EVAL 脚本逐字复制、传播和确定性执行逻辑。(从 6.0 版本之后,该功能被默认关闭,不再受支持)
- ACL:发布/订阅频道默认被阻塞 (acl-pubsub-default=resetchannels)
- SCRIPT LOAD 和 SCRIPT FLUSH 不再传播到从库/AOF
- ACL:在启动文件和命令行参数中声明重复的 ACL 用户将导致错误(之前最后一个声明将覆盖其他声明)
- 主从复制:TTL 总是被复制为绝对(非相对)毫秒时间戳
- 在可写副本上处理多键命令会先触发过期逻辑
- CONFIG SET maxmemory 在开始逐出逻辑之前返回
- AOF: 新的 Multi-Part 机制将数据作为一组多个文件存储在指定文件夹中
- 删除 STRALGO 命令
- 删除 gopher 协议支持
- MODULE 和 DEBUG 命令默认禁用,以提高安全性
- 拒绝 MULTI/EXEC 事务中的快照创建和其他管理命令
- 当 replica-serve-stale-data=no 时,PING 现在被 -MASTERDOWN 拒绝
- ACL GETUSER 使用 ACL 语法回复 keys 和 channels
- Command 命令回复丢弃 random 和 sort-for-scripts 标记
- 对不存在的列表进行计数的 LPOP/RPOP 返回空数组
- INFO commandstats 现在显示每个子命令的统计信息
- ZPOPMIN/ZPOPMAX 用于非 ZSET 类型时返回类型错误
- CONFIG GET 返回有效的当前值,即使正在使用隐式默认值
- CONFIG REWRITE 重写要加载的模块列表
- 无盘复制现在默认设置为 yes
- Shutdown 时,可以选择等待一段时间让副本完成复制
- 在加载期间允许大多数 CONFIG SET、REWRITE、RESETSTAT 命令
- 在加载期间允许使用 READONLY 和 READWRITE 命令
- 修改 SELECT、WAIT、ROLE、LASTSAVE、READONLY、READWRITE、ASKING 的 ACL 类别
- 在未经身份验证的连接上允许 RESET
- 允许在陈旧的副本上加载脚本
安全改进
- 敏感的命令和配置默认被禁用
- 更改配置项 bind(地址绑定)和保护模式的安全性
- redis-cli 的修改
- Sentinel 避免记录 auth-pass 值
性能和资源利用改进
- 集群模式下显著提高延迟并降低内存开销
- 在很多 zset 和 hash 键时降低内存开销
- 复制积压缓冲区和主从复置缓冲区使用一个全局共享的缓冲区
- 减少写时复制内存开销
- 释放集群发送缓冲区中未使用的容量
- 充分利用客户端结构内存用于回复缓冲区
- 将 ziplist 替换为 listpack
- 对于 list 支持存储超过 4GB 的元素
- 为临时客户端对象添加了一个池,以便在模块操作中重用
- 移除命令参数计数限制,动态增长 argv 缓冲区
- list 操作从更靠近元素的一侧开始查找
- 改进 fsync 以避免大量写入磁盘
- BITSET 和 BITFIELD SET 仅在值实际更改时传播
- 降低客户端被模块解锁阻塞时的延时
其他一般改进
- 主重启后可能进行部分同步
- Redis 从空启动时始终创建基础 AOF 文件
- 副本在 repl-diskless-load=swapdb 期间继续提供数据以获得更好的可用性
CLI 工具的变化
- 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 活动
平台/工具链支持相关改进
- 升级 jemalloc 5.2.1
- 修复 NetBSD 和 OpenBSD 上的 RSS 指标
- 检查 macOS、FreeBSD 和 OpenBSD 上的 somaxconn 系统设置
- 在 MacOS 上提高 fsync 的断电安全性
新的配置选项
- CONFIG SET/GET 可以在一次调用中处理多个配置
- 支持配置包含文件的 glob 模式匹配
- appenddirname,存放多部分 AOF 文件的文件夹
- maxmemory-clients,允许限制所有客户端的总内存使用量
- cluster-port,可以控制集群的绑定端口
- bind-source-addr,配置参数控制传出连接IP
- busy-reply-threshold,旧 lua-time-limit 的别名
- repl-diskless-sync-max-replicas,在某些情况下允许更快的复制
- latency-tracking, enabled by default, and latency-tracking-info-percentiles
- cluster-announce-hostname 和 cluster-preferred-endpoint-type
- cluster-allow-pubsublocal-when-down
- cluster-link-sendbuf-limit
- list-max-listpack- 、 hash-max-listpack-、 zset-max-listpack-* 作为 ziplist 配置的别名
INFO命令的改变
- INFO: latencystats 部分
- INFO: total_active_defrag_time and current_active_defrag_time
- INFO: total_eviction_exceeded_time and current_eviction_exceeded_time
- INFO: evicted_clients
- INFO: mem_cluster_links, total_cluster_links_buffer_limit_exceeded
- INFO: current_cow_peak
- INFO: Remove aof_rewrite_buffer_length
- MEMORY STATS: 在集群模式下报告 slot 到 key 的映射大小
- INFO MEMORY: 单独现实函数和 EVAL 的内存使用
- INFO MEMORY: 增加 mem_total_replication_buffers
- CLIENT LIST: tot-mem, multi-mem
- CLIENT LIST, INFO: 显示 RESP 版本
- SENTINEL INFO: tilt_mode_since
- LATENCY: 跟踪模块获取 GIL 延迟
MODULE API 的变化
- 添加用于回复 RESP3 类型的 API
- 添加来自 RM_Call 的 RESP3 类型的恢复回复功能
- RM_Call 添加 ‘0’ 和 ‘3’ 标志来控制要使用的 RESP 版本
- 添加对显式验证 ACL 的支持
- 添加 list 类型相关的 API
- 添加 API 以在长时间占用主线程时让出 Redis 事件
- 添加 API 用于注册到 Redis 事件循环
- 增强 mem_usage/free_effort/unlink/copy 和 IO 回调函数以适配 key 和 dbindex
- 增强 mem_usage 回调以获取请求的样本大小
- RM_GetContextFlags: 增加 CTX_FLAGS_ASYNC_LOADING, CTX_FLAGS_RESP3
- 将 API 标记改编为非实验性
- 添加 RM_CreateSubcommand
- 添加 RM_KeyExists
- 添加 RM_TrimStringAllocation
- 添加 RM_LoadDataTypeFromStringEncver
- 添加 RM_MonotonicMicroseconds
- 添加 ReplAsyncLoad 事件并弃用 ReplBackup 事件
- 为 RM_SetModuleOptions 增加 OPTIONS_HANDLE_REPL_ASYNC_LOAD 标志
Bug 修复
- 当 key 不存在时,调用 EVAL 上的 COMMAND GETKEYS
- 通过分配器提高内存使用率
- 手动故障转移结束后取消暂停客户端,而不是等待
- Lua:修复带有许多参数的脚本调用崩溃
- Lua:使用所有字符计算字符串哈希以防止哈希冲突
- 防止 LCS 通过 proto-max-bulk-len 分配临时内存
- Tracking:始终在命令回复后发出无效消息
- Cluster:CLUSTER SLOTS 响应中隐藏空的 slave
- CLIENT KILL 在 ID 为 0 时杀死所有客户端
- 使用 list-compress-depth 修复列表周围的错误
- 修复 RESTORE、RDB 加载和模块 API 中的一个 LRU 错误
- 使用 RESETSTAT 重置 lazyfreed_objects 信息字段
- 修复 RDB 和列表节点压缩以处理大于 4GB 的值
- 修复向 Set 或 Hash 添加大于 2GB 的元素时的崩溃
- 无盘复制不能算作更改
- 修复由于溢出导致的过度流修剪
- 加载时接收 SIGTERM 时安全有序的退出
- 改进 EXPIRE TTL 溢出检测
- 为 INFO 错误统计添加丢失的错误计数
- DECRBY LLONG_MIN 导致否定溢出
- 修复消费者创建和删除中的 Stream keyspace 通知
- 修复 zset 中超过 2B 条目的排列溢出
- 如果文件夹名称包特殊字符,请避免以 check-aof / check-rdb / sentinel 模式启动
- 只有在解析完整个配置文件后才创建日志文件
- redis-cli:修改 --bigkeys、–memkeys、–hotkeys 的 SCAN 睡眠间隔
- redis-cli:修复提示以在RESET 后显示正确的 DB 编号和事务状态
- 模块 API:修复可能的传播错误,以防模块在命令之外调用 CONFIG SET maxmemory
- 模块 API:将客户端 RESP 版本传递给模块被阻塞的客户端
- 模块 API:在集群重新分片和关闭状态下释放模块命令阻塞的客户端
- Sentinel:修复主机重启后的可用
- Sentinel:使用 TLS 修复内存泄漏
- Sentinel:修复由于重复的零端口可能导致的故障转移
- Sentinel:修复主机名支持问题
- Sentinel:修复某些容器环境中的选举失败
已知的问题
- 缺少提供附加命令元数据的模块 API
- 缺少支持新 ACL 选择器的模块 API
- ACL 键访问选择器还不适用于带有 GET/BY 的 SORT 命令
- redis-check-aof 中缺少 Multi-Part AOF 支持