Redis 7.2 破坏性变更
当开源 Redis 的新主版本更改现有命令时,将数据库升级到新版本可能会破坏某些功能。在升级之前,请务必阅读提供的、影响 Redis Enterprise 的破坏性变更列表,并更新连接到数据库的任何应用程序以处理这些变更。
使用管理控制台确认您的 Redis 数据库版本 (redis_version),或者通过 redis-cli 运行以下 INFO 命令
$ redis-cli -p <port> INFO
"# Server
redis_version:7.0.8
..."
来自 7.0 版本的破坏性变更
从 7.0 版本升级到 Redis 7.2 版本会引入以下可能对 Redis Enterprise 造成破坏性变更
可编程性
-
时间采样现在在命令执行和脚本期间被冻结 (#10300)。当命令或脚本运行时,该命令或脚本使用的键不会过期。这会破坏任何使用循环等待键过期的脚本。
错误处理
-
当键不再存在时释放的被阻止的流命令会返回不同的错误代码 (#11012)。
- 对于新解锁的流、列表和 zsets,旧实现会在流键被删除或被不同类型覆盖时返回
UNBLOCKED。 现在,错误将与命令在效果之后处理时相同。
- 对于新解锁的流、列表和 zsets,旧实现会在流键被删除或被不同类型覆盖时返回
-
ACL 错误已在 Redis 中统一。 (#11160)
- 当使用 RedisModule_Call 模块 API 函数时,ACL 错误返回
-NOPERM而不是-ERR
- 当使用 RedisModule_Call 模块 API 函数时,ACL 错误返回
-
XREADGROUP和XAUTOCLAIM创建一个消费者,无论它是否能够执行读取或声明 (#11012)。 -
任何非数字的浮点数都将返回
nan(#11597)。
ACLs
- 当一个被阻止的客户端被解除阻止时,现在会重新评估 ACL 和 OOM 条件检查 (#11012)。
- 如果自命令执行以来 ACL 规则已更改,则该命令可能在客户端被解除阻止后失败。
命令内省、统计信息和配置
-
当运行
XINFO CONSUMERS时,idle时间现在显示自上次尝试交互以来经过的毫秒数,而inactive时间显示自上次成功交互以来经过的毫秒数 (#11099)- 以前,
idle时间显示自上次成功交互以来经过的毫秒数,并且没有inactive时间。
- 以前,
-
命令统计信息仅在命令执行时更新 (#11012)。
- 以前,即使命令被阻止,也会更新命令统计信息。 现在,仅当命令被执行时才会更新命令统计信息。
来自 6.2 版本的破坏性变更
从 6.2 版本升级到开源 Redis 7.2 版本会引入以下可能对 Redis Enterprise 造成破坏性变更。
所有 来自 7.0 版本的破坏性变更 也适用于 Redis 6.2 版本。
可编程性
-
Lua 脚本不再有权访问
print()函数 (#10651) -print函数已从 Lua 中删除,因为它可能会导致 Redis 进程卡住(如果无人从 stdout 读取)。 用户应使用 redis.log。另一种方法是覆盖print实现并将消息打印到日志文件中。 -
阻止只读脚本 (*_RO 命令,
no-writes) 中的PFCOUNT和PUBLISH(#10744) - 将PFCOUNT和PUBLISH视为脚本中的写入命令,除了EVAL; 意思是- 它们永远不能在带有 shebang (
#!) 且没有no-writes标志的脚本中使用 - 它们在
EVAL_RO和_RO变体中被阻止,(即使在没有 shebang (#!) 标志的脚本中) - 允许 EVAL 中(不仅仅是 EVAL_RO 中)的
no-write脚本,即使在CLIENT PAUSE WRITE期间
- 它们永远不能在带有 shebang (
-
从
COMMAND命令响应中隐藏may_replicate标志 (#10744) - 作为将may_replicate命令PFCOUNT和PUBLISH视为脚本中的写入命令(除了EVAL)的更改的一部分,may_replicate标志已从COMMAND响应中删除。
错误处理
-
重新措辞了一些关于无效命令或参数的错误响应 (#10612) -
- 未知命令的错误响应引入了大小写更改 (
Unknown到unknown) - 模块命令的错误已扩展到涵盖子命令,更新了语法以匹配 Redis 服务器语法
- 模块命令的 Arity 错误引入了大小写更改 (
Wrong到wrong); 将考虑完整的命令名称
- 未知命令的错误响应引入了大小写更改 (
-
更正了从
EVAL脚本返回的错误代码 (#10218, #10329)。以下示例显示了行为的变化
1: config set maxmemory 1 2: +OK 3: eval "return redis.call('set','x','y')" 0 - 4: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: @user_script: 1: -OOM command not allowed when used memory > 'maxmemory'. + 4: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: OOM command not allowed when used memory > 'maxmemory'. 5: eval "return redis.pcall('set','x','y')" 0 - 6: -@user_script: 1: -OOM command not allowed when used memory > 'maxmemory'. + 6: -OOM command not allowed when used memory > 'maxmemory'. 7: eval "return redis.call('select',99)" 0 8: -ERR Error running script (call to 4ad5abfc50bbccb484223905f9a16f09cd043ba8): @user_script:1: ERR DB index is out of range 9: eval "return redis.pcall('select',99)" 0 10: -ERR DB index is out of range 11: eval_ro "return redis.call('set','x','y')" 0 -12: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: @user_script: 1: Write commands are not allowed from read-only scripts. +12: -ERR Error running script (call to 71e6319f97b0fe8bdfa1c5df3ce4489946dda479): @user_script:1: ERR Write commands are not allowed from read-only scripts. 13: eval_ro "return redis.pcall('set','x','y')" 0 -14: -@user_script: 1: Write commands are not allowed from read-only scripts. +14: -ERR Write commands are not allowed from read-only scripts. -
ZPOPMIN/ZPOPMAX在计数为 0 且非 zset 时会产生错误的回复 #9711)- 当
key不是排序集且可选的count参数设置为0时,ZPOPMIN/ZPOPMAX过去会生成一个(empty array),现在会生成一个WRONGTYPE错误响应。 - 可选的
count参数必须为正数。 负值会产生value is out of range错误。
以下示例显示了行为的变化
1: zadd myzset 1 "one" 2: (integer) 1 3: zadd myzset 2 "two" 4: (integer) 1 5: zadd myzset 3 "three" 6: (integer) 1 7: zpopmin myzset -1 - 8: (empty array) + 8: (error) ERR value is out of range, must be positive 9: 127.0.0.1:6379> set foo bar 10: OK 11: zpopmin foo 0 -12: (empty array) +12: (error) WRONGTYPE Operation against a key holding the wrong kind of value - 当
-
针对不存在的列表使用带计数的
LPOP/RPOP返回空数组而不是(nil)(#10095)。 此更改已向后移植到 6.2。 -
当计数为 0 时,
LPOP/RPOP过去会生成(nil),现在会生成一个空数组 (#9692)。 此更改已向后移植到 6.2。 -
XCLAIM/XAUTOCLAIM跳过已删除的条目,而不是回复nil并从待处理条目列表 (PEL) 中删除它们 (#10227) -XCLAIM/XAUTOCLAIM现在以以下方式运行- 如果您尝试声明已删除的条目,它将从找到它的待处理条目列表 (PEL) 中删除(以及组 PEL)。 因此,不声明这样的条目,只是从 PEL 中清除(因为它无论如何都不存在于流中)。
- 由于不声明已删除的条目,因此
X[AUTO]CLAIM不会返回 "nil" 而不是条目。 - 已将所有已删除的流 ID 的数组添加到
XAUTOCLAIM响应。
ACLs
-
ACL GETUSER回复现在对keys和channels使用 ACL 语法 (#9974)。ACL GETUSER现在对键和通道使用 ACL DSL(领域特定语言)。以下示例显示了行为的变化
1: acl setuser foo off resetchannels &channel1 -@all +get 2: OK 3: acl getuser foo 4: 1) "flags" 5: 2) 1) "off" 6: 3) "passwords" 7: 4) (empty array) 8: 5) "commands" 9: 6) "-@all +get" 10: 7) "keys" -11: 8) (empty array) +11: 8) "" 12: 9)"channels" -13 10) 1) "channel1" +13 10) "&channel1" -
如果 ACL 未授予命令完全密钥空间访问权限,则
SORT/SORT_RO命令会拒绝GET和BY中的密钥访问模式 (#10340) -sort和sort_ro命令可以通过GET和BY访问外部键。 为了确保用户不会违反授权 ACL 规则,Redis 7 将拒绝外部密钥访问模式,除非 ACL 允许SORT完全访问所有密钥。 为了向后兼容,带有GET/BY的SORT仍然有效,但如果 ACL 对某些密钥有限制,则使用这些功能将导致权限被拒绝错误。以下示例显示了行为的变化
USER FOO (+sort ~* ~mylist) #FOO> sort mylist by w* get v* - is O.K since ~* provides full key accessUSER FOO (+sort %R~* ~mylist) #FOO> sort mylist by w* get v* - is O.K since %R~* provides full key READ access**USER FOO (+sort %W~* ~mylist) #FOO> sort mylist by w* get v* - will now fail since $W~* only provides full key WRITE accessUSER FOO (+sort ~v* ~mylist) #FOO> sort mylist by w* get v* - will now fail since ~v* only provides partial key access -
修复了
SELECT、[WAIT](/docs/latest/commands/wait/, [ROLE](/docs/latest/commands/role/, [LASTSAVE](/docs/latest/commands/lastsave/, [READONLY](/docs/latest/commands/readonly/, [READWRITE](/docs/latest/commands/readwrite/,ASKING的 ACL 类别 (#9208)SELECT和WAIT已从@keyspace重新分类为@connectionROLE、LASTSAVE已被分类为@admin和@dangerousASKING、READONLY、READWRITE也已分配@connection类别,并从@keyspace中删除- 命令类别在 ACL 文档 中进行了解释
命令内省、统计信息和配置
-
COMMAND回复删除了random和sort-for-scripts标志,这些标志现在是 命令提示 的一部分 (#10104) -random标志已替换为nondeterministic_output提示;sort-for-scripts标志已替换为nondeterministic_output_order提示 -
INFOcommandstats现在显示每个子命令的统计信息 (#9504) 例如,虽然以前的版本会为所有命令用法提供单个条目,但在 Redis 7 中,每个子命令都会单独报告-
Redis 6.2
cmdstat_acl:calls=4,usec=279,usec_per_call=69.75,rejected_calls=0,failed_calls=2 -
Redis 7
cmdstat_acl|list:calls=1,usec=4994,usec_per_call=4994.00,rejected_calls=0,failed_calls=0 cmdstat_acl|setuser:calls=2,usec=16409,usec_per_call=8204.50,rejected_calls=0,failed_calls=0 cmdstat_acl|deluser:calls=1,usec=774,usec_per_call=774.00,rejected_calls=0,failed_calls=0 cmdstat_acl|getuser:calls=1,usec=6044,usec_per_call=6044.00,rejected_calls=0,failed_calls=0
-
-
CONFIG REWRITE、[CONFIG RESETSTAT](/docs/latest/commands/config-resetstat/, 以及大多数 [CONFIG SET](/docs/latest/commands/config-set/commands 现在在加载期间被允许 (#9878)