Redis 7.0-rc1 版本发布了,都有什么新功能呢

本文翻译自 https://github.com/redis/redis/releases, 由于译者才疏学浅,错漏之处敬请海涵。

Redis 7.0-rc1 新增加了几个面向用户的功能,并对性能和其他的方面做了优化。 有些修改可能破坏旧版本向后兼容性,请谨慎升级。
与之前版本有明显区别的,需要用户特别注意:

  1. Redis7 将 AOF 作为多个文件存储在一个文件夹中
  2. Redis7 对 RDB 文件使用了新版本格式(10),与旧版本不兼容
  3. Redis7 在加载旧的 RDB 文件时,会将 ziplist 编码的 key 转换为 listpack。 这通常发生在从 RDB 加载文件或者主从复制之间,并且会降低加载速度。
  4. 更多的改变可以查看有关重大更新的部分

如果对源代码感兴趣,可以参考 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 支持
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值