Redis 6.0发布说明

======================================================

Redis 6.0.20 Released Mon July 10 12:00:00 IDT 2023

======================================================

Upgrade urgency SECURITY: See security fixes below.

Security Fixes

(CVE-2022-24834) 指的是一项安全漏洞,其中特别设计的 Lua 脚本在 Redis 中执行时,能够引起 cjson 和 cmsgpack 库中的堆溢出。这种溢出可能导致堆损坏,并有可能进一步开放远程代码执行的通道。此问题影响所有自 2.6 版本起支持 Lua 脚本功能的 Redis 版本,但需要注意的是,只有已通过认证并授权的用户才可能成为此漏洞的攻击目标。

Bug Fixes

  • 在存在由 fork 产生的子进程期间,重新启用向下调整大小的重哈希操作(#12276)

======================================================
Redis 6.0.19 Released Mon Apr 17 16:00:00 IST 2023

Upgrade urgency: SECURITY, contains fixes to security issues.

Security Fixes

(CVE-2023-28856) 指的是一项安全漏洞,其中认证过的用户能够利用 HINCRBYFLOAT 命令创建一个无效的哈希字段。当 Redis 尝试访问这个异常构造的字段时,会导致服务崩溃。这意味着,拥有合法登录凭证的用户可以通过精心构造的命令来触发系统故障,影响服务的稳定性和可用性。

Bug Fixes

  • 修复了CLIENT REPLY OFFCLIENT REPLY SKIP命令导致静音推送通知的问题(编号 #11875)。这项修复确保了在客户端回复模式设置为不接收任何回复(OFF)或跳过回复(SKIP)时,仍然能够正常接收推送通知,不会影响到这些通知的传递。

======================================================

Redis 6.0.18 Released Tue Feb 28 12:00:00 IST 2023

======================================================

Upgrade urgency: SECURITY, contains fixes to security issues.

Security Fixes

  • (CVE-2023-25155) 指的是一项安全漏洞,其中特制的 SRANDMEMBERZRANDMEMBERHRANDFIELD 命令能够触发整数溢出,进而导致运行时断言失败,并终止 Redis 服务器进程。这意味着攻击者通过精心构造的命令,可能迫使 Redis 服务意外退出,影响服务的连续性和稳定性。

  • (CVE-2022-36021) 描述了另一项安全问题,涉及字符串匹配命令(如 SCANKEYS),攻击者可以利用特制的模式触发拒绝服务攻击,导致 Redis 陷入挂起状态并占用 100% 的 CPU 时间。这种攻击能够有效地使 Redis 服务器停止响应其他请求,严重影响服务的可用性。

Bug Fixes

  • 确保由 fork 创建的子进程不执行增量式重哈希操作 (#11692)
  • 修复集群中入站连接的保活时间问题 (#11785)

======================================================

Redis 6.0.17 Released Tue Jan 17 12:00:00 IDT 2023

======================================================

Upgrade urgency: SECURITY, contains fixes to security issues.

Security Fixes

(CVE-2022-35977) 指的是一项安全漏洞,涉及到 Redis 的 SETRANGESORT/SORT_RO 命令中的整数溢出问题。这个漏洞可能致使 Redis 遭遇内存耗尽(Out Of Memory,OOM)并触发恐慌(panic),从而导致 Redis 服务不可用。

具体来说,当攻击者利用特制的参数调用 SETRANGE 命令时,可以触发整数溢出,这可能会导致 Redis 尝试分配远超过预期的内存空间,最终消耗完所有可用内存,引发 OOM 错误。类似地,SORTSORT_RO 命令在处理特定输入时也存在相似的整数溢出风险,可能导致同样的后果。

Bug Fixes

  • 修复客户端发出过长的 SRANDMEMBER 命令并在达到客户端输出缓冲区限制时断开连接导致的挂起问题(#11676)
  • Lua:修复在 v6.0.16 版本中因脚本调用含过多参数导致的崩溃问题,这是一个回归错误(#9809)
  • Lua:在评估 Lua 脚本时增加对 min-slave-* 配置项的检查(#10160)
  • 修复因某些编译器的未定义行为导致的 BITFIELD 溢出检测问题(#9601)

======================================================

Redis 6.0.16 Released Mon Oct 4 12:00:00 IDT 2021

======================================================

Upgrade urgency: SECURITY, contains fixes to security issues.

Security Fixes

  1. (CVE-2021-41099) 当手动配置proto-max-bulk-len为非默认的极大值时,在处理特定字符串命令和网络负载时,可能出现整数到堆缓冲区溢出的问题。此漏洞由yiyuaner报告。

  2. (CVE-2021-32762) 在一些较旧或不太常见的平台上,redis-cliredis-sentinel解析大型多批量回复时,存在整数到堆缓冲区溢出的问题。此漏洞由Microsoft Vulnerability Research报告。

  3. (CVE-2021-32687) 当手动配置set-max-intset-entries为非默认的极大值时,在处理intsets(整数集合)时发生整数到堆缓冲区溢出。该问题由Pawel Wieczorkiewicz(AWS)报告。

  4. (CVE-2021-32675) 处理具有大量元素的RESP请求负载时,在多个连接上可能导致拒绝服务(Denial Of Service)。

  5. (CVE-2021-32672) Lua调试器存在随机堆读取问题,由Meir Shpilraien报告。

  6. (CVE-2021-32628) 当为hash-max-ziplist-entrieshash-max-ziplist-valuezset-max-ziplist-entrieszset-max-ziplist-value配置了较大的非默认值时,在处理压缩列表编码的数据类型时可能发生整数到堆缓冲区溢出。该漏洞由sundb报告。

  7. (CVE-2021-32627) 当配置了非默认的大值给proto-max-bulk-lenclient-query-buffer-limit时,处理流(streams)数据时存在整数到堆缓冲区溢出的问题。同样由sundb报告。

  8. (CVE-2021-32626) 特别设计的Lua脚本可能导致堆缓冲区溢出,该问题同样由Meir Shpilraien报告。

其他错误修复包括:

  • 修复了在MacOS和FreeBSD(kqueue)上appendfsync始终保证在回复前执行fsync的问题 (#9416)
  • 修正了对sync_file_range系统调用的错误误识别问题,该问题曾影响性能 (#9371)
  • 解决了使用repl-diskless-load时的复制问题 (#9280)

======================================================

Redis 6.0.15 Released Wed Jul 21 16:32:19 IDT 2021

======================================================

Upgrade urgency: SECURITY, contains fixes to security issues that affect
authenticated client connections on 32-bit versions. MODERATE otherwise.

修复在32位版本中的BITFIELD整数溢出问题(CVE-2021-32761)
Redis 2.2及以上版本中存在一个整数溢出漏洞,攻击者可以利用BITFIELD命令破坏堆内存,有可能导致远程代码执行。

涉及行为改变的漏洞修复:

  • 更改RESP3中带有计数参数的ZPOPMAX/MIN命令的响应类型为嵌套数组 (#8981)。
    之前像RESP2一样使用扁平数组,现更正为像ZRANGE命令那样使用嵌套数组。

漏洞修复:

  • 当监视的键已过期时,使EXEC命令失败 (#9194)
  • 修复SMOVE命令在成员已存在时不使目标键失效(WATCH监控与跟踪)的问题 (#9244)
  • 修复SINTERSTORE在遇到错误类型时不清除目标键的问题 (#9032)
  • 修复32位版本中GETBIT、SETBIT、BITCOUNT、BITPOS和BITFIELD的溢出问题 (#9191)
  • 在集群总线的入站连接上设置TCP保持活动(#9230)
  • 修复大端平台上的压缩列表长度更新问题 (#2080)
  • 修复无盘复制加载过程中,因模块AUX数据的RDB短读而恢复失败的问题 (#9199)
  • 修复客户端追踪中的竞态条件 (#9116)
  • 如果无盘复制子进程被终止,确保能够回收子进程PID (#7742)
  • 为卡在全量同步中的副本添加超时机制 (#8762)

CLI工具改进:

  • redis-cli的cluster import支持需要身份验证的源和目标 (#7994)
  • redis-cli的cluster import命令可能发出错误的MIGRATE命令,使用COPY而非REPLACE (#8945)
  • redis-cli在CSV和RAW输出格式中增加对RESP3集合类型的支援 (#7338)

======================================================

Redis 6.0.14 Released Tue June 1 12:00:00 IST 2021

======================================================

Upgrade urgency: SECURITY, Contains fixes to security issues that affect
authenticated client connections. MODERATE otherwise.

修复STRALGO LCS中的整数溢出问题(CVE-2021-32625)
在Redis 6.0或更高版本中存在一个整数溢出漏洞,攻击者可以利用STRALGO LCS命令破坏堆内存,有可能导致远程代码执行。这是CVE-2021-29477修复不完全所导致的结果。

其他漏洞修复

  • 修复在具有已删除消费者组的流键上执行UNLINK时的崩溃问题 (#8932)
  • SINTERSTORE:当所有源都不存在时,添加缺失的keyspace删除事件 (#8949)

======================================================

Redis 6.0.13 Released Mon May 3 19:00:00 IST 2021

======================================================

Upgrade urgency: SECURITY, Contains fixes to security issues that affect
authenticated client connections. LOW otherwise.

STRALGO LCS命令中的整数溢出问题(CVE-2021-29477):
在Redis 6.0或更高版本中存在一个整数溢出漏洞,攻击者可能利用STRALGO LCS命令破坏堆内存,进而可能导致远程代码执行。此整数溢出漏洞存在于从6.0版开始的所有Redis版本中。

COPY命令针对大型intsets的整数溢出问题(CVE-2021-29478):
Redis 6.2中存在一个整数溢出漏洞,可能被利用来破坏堆内存,并潜在地导致远程代码执行。该漏洞涉及更改默认的set-max-intset-entries配置值,创建一个由整数值组成的大型集合键,并使用COPY命令复制它。此整数溢出漏洞存在于自2.6版起的所有Redis版本中,尽管在那里它可能导致RDB或DUMP负载损坏,但无法通过COPY命令(在6.2之前不存在)进行利用。

漏洞修复:

  • 集群:跳过可能阻止故障检测的不必要的检查 (#8585)
  • 修复在没有IPv6的alpine/libmusl上无法启动的问题 (#8655)

性能改进:

  • 修复Redis 6.0中BRPOP的性能下降问题 (#8689)

模块:

  • 修复模块客户端解除阻塞时的边缘情况问题 (#8618)

======================================================

Redis 6.0.12 Released Mon Mar 1 17:29:52 IST 2021

======================================================

Upgrade urgency: LOW, fixes a compilation issue.

Bug Fixes

** 修复在非glibc系统上,如果不使用jemalloc时的编译错误 (#8533)

======================================================

Redis 6.0.11 Released Mon Feb 22 16:13:23 IST 2021

======================================================

Upgrade urgency: SECURITY if you use 32bit build of redis (see bellow), LOW
otherwise.

32位系统上的整数溢出(CVE-2021-21309)
Redis 4.0或更高版本使用可配置的限制来设定支持的最大批量输入大小。默认情况下,它是512MB,这个值对所有平台都是安全的。如果该限制被显著增大,从客户端接收到一个大的请求可能会触发几个整数溢出场景,这将导致缓冲区溢出和堆损坏。

漏洞修复:

  • 当proto-max-bulk-len设置得很高时,避免32位溢出 (#8522)
  • 修复了线程I/O和CLIENT PAUSE(故障转移)的处理方式,可能导致数据丢失或崩溃 (#8520)
  • 修复了从大型哈希表中选择随机元素的问题 (#8133)
  • 修复了客户端追踪中tracking-redir-broken消息的协议错误 (#8456)
  • XINFO能够在副本上访问已过期的键 (#8436)
  • 使用-a或–dbnum时,修复redis-benchmark中的协议错误 (#8486)
  • 在测试arm64写时复制(CoW)漏洞时,避免在旧内核上触发断言 (#8405)
  • CONFIG REWRITE应遵循umask设置 (#8371)
  • 为某些命令修复COMMAND命令中的firstkey,lastkey,step问题 (#8367)

模块:

  • RM_ZsetRem:如果集合为空则删除键,该bug可能导致留下空的zset键 (#8453)

======================================================

Redis 6.0.10 Released Tue Jan 12 16:20:20 IST 2021

======================================================

Upgrade urgency MODERATE: several bugs with moderate impact are fixed,
此版本相较于6.0.9所做的全面变更如下:

命令行为变更:

  • SWAPDB现在会令被WATCH的键失效 (#8239)
  • 在可写的副本上使用SORT命令时,其行为有所不同 (#8283)
  • EXISTS不应改变LRU状态 (#8016)
    在Redis 5.0和6.0中,它会触碰键的LRU/LFU。
  • OBJECT不应揭示逻辑上已过期的键 (#8016)
    现在的行为将与TYPE或其他非DEBUG命令一致。
  • GEORADIUS[BYMEMBER]在Redis超过内存限制时可能因-OOM错误失败 (#8107)

其他行为变更:

  • Sentinel: 修复SENTINEL SET命令后配置文件未更新的问题 (#8229)
  • CONFIG REWRITE变得原子化且更安全,但需要写入配置文件所在目录的权限 (#7824, #8051)
    此变更已在6.0.9中存在,但未被包含在发布说明中。

兼容性影响的漏洞修复(Redis 6.0引入的bug)

  • 修复大端系统上的RDB CRC64校验和问题 (#8270)
    如使用大端系统,请考虑与RESTORE、复制和持久化的兼容性影响。
  • 修复Lua中map响应中键值顺序错误的问题 (#8266)
    如果你的脚本使用redis.setresp()或返回map(Redis 6.0新增),请考虑其影响。

漏洞修复:

  • 修复父进程fork后子进程删除pidfile的问题 (#8231)
  • 修复启用io-threads-do-reads时的崩溃问题 (#8230)
  • 修复执行cluster backup后redis-cli崩溃的问题 (#8267)
  • 处理模块阻塞客户端的输出缓冲区限制 (#8141)
    可能导致模块向阻塞客户端发送回复超出限制。
  • 修复与setproctitle相关的崩溃问题 (#8150, #8088)
    主要在启动时引起各种崩溃,特别是在Apple M1芯片上或在仪器检测下。
  • 在repl-diskless-load=swapdb模式下,备份/恢复集群模式的键到插槽映射 (#8108)
    在集群模式下使用repl-diskless-load加载失败时,插槽映射不会被恢复。
  • 修正oom-score-adj-values范围及在配置文件中使用的bug (#8046)
    启用后在配置文件中再次设置可能会有问题。
  • 清空数据库时重置平均TTL (#8106)
    导致INFO中的指标有误导性。
  • 当Redis有子进程时禁用rehash (#8007)
    这可能在BGSAVE、复制或AOFRW期间造成过多的CoW。
  • ACL类别挑选算法进一步优化 (#7966)
    ACL GETUSER的输出现在更接近ACL SETUSER提供的输出。
  • 修复模块GIL过早释放的bug (#8061)
    理论上(且很少)可能导致多线程模块内存损坏。
  • 减轻client tracking引起的键驱逐反馈循环影响 (#8100)
  • 修复在老ARM上因访问未对齐内存导致的集群崩溃(SIGBUS) (#7958)
  • 修复保存大于2GB的字符串到RDB文件的问题 (#8306)

额外改进:

  • 在特定情况下避免浪费的临时内存分配 (#8286, #5954)

平台/工具链支持相关改进:

  • 修复ARM上的崩溃日志寄存器输出 (#8020)
  • 添加对ARM64 Linux内核bug的检查 (#8224)
    由于该问题的潜在严重性,Redis将在启动时打印日志警告。
  • 修复树莓派构建问题 (#8095)

新配置选项:

  • oom-score-adj-values配置现在可以接受绝对值(除了相对值) (#8046)

模块相关修复:

  • 移动RMAPI_FUNC_SUPPORTED以便可用 (#8037)
  • 提高计时器精度 (#7987)
  • 允许RM_CreateStringPrintf结果中包含’\0’ (#6260)

======================================================

Redis 6.0.9 Released Mon Oct 26 10:37:47 IST 2020

======================================================

Upgrade urgency: SECURITY if you use an affected platform (see below). Otherwise the upgrade urgency is MODERATE.

此版本修复了在使用除jemalloc或glibc的malloc之外的堆分配器时可能出现的堆溢出问题。详情请参阅:
https://github.com/redis/redis/pull/7963

此版本中的其他修复包括:

新增功能:

  • 客户端参数argv的内存报告 (#7874)
  • 向redis-cli添加对原始格式行分隔符的控制 (#7841)
  • 向redis-cli添加对rediss:// -u前缀的支持 (#7900)
  • 为NetBSD和DragonFlyBSD添加获取rss大小支持

行为变更:

  • WATCH现在不再忽略MULTI/EXEC中已过期的键 (#7920)
  • 修正STREAM类型下的OBJECT ENCODING响应 (#7797)
  • 允许在集群副本上阻塞的XREAD操作 (#7881)
  • TLS:未使用时不强制要求CA配置 (#7862)

错误修复:

  • INFO报告真正的峰值内存(驱逐前)(#7894)
  • 允许requirepass配置清除密码 (#7899)
  • 修复配置重写文件处理,确保其原子性 (#7824)
  • 修复ACL显示过多类别的问题 (#7889)
  • 在接收完整RDB负载时,副本执行fsync (#7839)
  • 当输出缓冲区限制达到时,不再向套接字写入回复 (#7202)
  • 修复redis-check-rdb对模块辅助数据的支持 (#7826)
  • 其他小型错误修复

模块API:

  • 添加用于版本和兼容性检查的APIs (#7865)
  • 添加RM_GetClientCertificate (#7866)
  • 添加RM_GetDetachedThreadSafeContext (#7886)
  • 添加RM_GetCommandKeys (#7884)
  • 添加Swapdb模块事件 (#7804)
  • RM_GetContextFlags指示是否处于fork子进程 (#7783)
  • RM_GetContextFlags文档中补充了缺失的标志:MULTI_DIRTY, IS_CHILD (#7821)
  • 在连接事件上暴露真实客户端 (#7867)
  • 对模块因键阻塞的轻微改进 (#7903)

======================================================

Redis 6.0.8 Released Wed Sep 09 23:34:17 IDT 2020

======================================================

错误修复:

  • 在通过CONFIG SET或从配置文件加载设置oom-score-adj值后执行CONFIG REWRITE,将生成一个损坏的配置文件,导致Redis无法启动
  • 修复了在MacOS上使用redis-cli --pipe的问题
  • 修复了针对不存在的键的HKEYS/HVALS命令在RESP3响应中的问题
  • 各种小型错误修复

新功能/变更:

  • 当THP设置为madvise时,移除警告
  • 允许在集群的只读副本上使用EXEC执行读取命令
  • 向redis-cli --cluster call命令添加masters/replicas选项

模块API:

  • 添加RedisModule_ThreadSafeContextTryLock函数

======================================================

Redis 6.0.7 Released Fri Aug 28 11:05:09 IDT 2020

======================================================

Upgrade urgency MODERATE: several bugs with moderate impact are fixed,
Specifically the first two listed below which cause protocol errors for clients.

错误修复:

  • 在RDB/AOF载入期间到达时,CONFIG SET可能会使客户端挂起(当其在一个同样因-LOADING错误被拒绝的其他命令之后处理时)
  • 当RANK大于匹配项时,LPOS命令会以损坏的协议响应(负的多bulk计数)
  • 对于流类型键的UNLINK/懒惰释放永远不会执行异步释放
  • PERSIST应当使WATCH失效(如同EXPIRE所做的那样)
  • 只包含读取命令的EXEC在内存不足(OOM)时可能被拒绝
  • TLS:在CONFIG SET上放松验证(如果启用了某些配置但TLS未启用,也不报错)
  • TLS:支持在不使用tls-port的情况下进行集群/复制
  • 系统启动后在网络在线时启动Redis
  • Redis-benchmark性能提升
  • 各种小型错误修复

新特性:

  • 添加oom-score-adj配置选项以控制Linux OOM杀手
  • 在INFO输出中显示IO线程的统计信息和状态
  • 添加可选的TLS验证模式(参见tls-auth-clients)

模块API:

  • 添加RedisModule_HoldString
  • 添加已加载的键空间事件
  • 修复RedisModuleEvent_LoadingProgress
  • 修复在成功psync时缺少的RedisModuleEvent_MasterLinkChange钩子
  • 修复缺失的RM_CLIENTINFO_FLAG_SSL
  • 为了与-fno-common / extern一起使用,重构redismodule.h

======================================================

Redis 6.0.6 Released Mon Jul 20 09:31:30 IDT 2020

======================================================

Upgrade urgency MODERATE: several bugs with moderate impact are fixed here.

最重要的问题包括:

  • 修复了启用带有前缀的CLIENT TRACKING时的崩溃问题
  • EXEC总是以EXECABORT失败,并且清除了事务状态
  • RESTORE ABSTTL不会将已过期的键存储到数据库中
  • redis-cli改善了对不可打印键名的处理
  • TLS:当tls-auth-clients关闭时忽略客户端证书
  • 跟踪:修复flush时的失效消息问题
  • Sentinel启动时通知systemd
  • 修复了错误使用STRALGO导致的崩溃
  • 模块API的少数修复
  • 修复了几个罕见的泄露问题(STRALGO错误误用、Sentinel)
  • 修复了脚本defrag中可能的非法访问(不太可能造成实际损害)

新功能:

  • LPOS命令,用于在列表中搜索
  • 在集群模式下,redis-cli和redis-benchmark的MIGRATE命令使用用户名+密码
  • redis-cli为–pipe、–rdb和–replica选项增加了对TLS的支持
  • TLS:支持会话缓存配置

======================================================

Redis 6.0.5 Released Tue Jun 09 11:56:08 CEST 2020

======================================================

Upgrade urgency MODERATE: several bugs with moderate impact are fixed here.

这里列举了最关键的问题修复:

  • 修复了ACL LOAD过程中特殊字符的处理问题。
  • 提升了Redis Cluster对可能引发两个集群混合操作错误的抵抗能力。
  • 恢复了RDB传输中sendfile()功能的原实现,因其引入了一些延迟。
  • 修正了链式证书的TLS证书加载问题。
  • 修复了AOF重写时关于KEEPTTL SET选项的功能。
  • 解决了在执行-BUSY脚本错误期间MULTI/EXEC命令的行为问题。

======================================================

Redis 6.0.4 Released Thu May 28 11:36:45 CEST 2020

======================================================

Upgrade urgency CRITICAL: this release fixes a severe replication bug.

Redis 6.0.4修复了一个由Redis 6引入的新特性导致的关键复制漏洞。该特性名为“有意义的偏移量”(meaningful offset),是antirez强烈倡导的一项改进,旨在避免主节点在故障转移过程中被降级为从节点时,无法与新的主节点进行部分同步的情况。简而言之,该特性能够避免使用RDB进行全量同步。它是如何工作的呢?通过修剪复制积压队列中主节点发送到复制通道的最后的“PING”命令:这样,复制偏移量就不会再超过被晋升为新主节点的从节点的偏移量,使得原主节点可以继续沿用相同的复制历史,只需接收少量的数据差异。

然而,在该特性引入后,Redis核心团队很快意识到存在一些问题:这个看似无害的特性出现了多个漏洞,最后一个我们发现的漏洞,在多人共同努力下修复后,我们甚至未能完全理解其根源。我们决定,该特性的复杂性成本过高。因此,Redis 6.0.4完全移除了这一特性,并修复了它可能导致的数据损坏问题。

但有两个事实需要铭记。

事实1:使用链式复制设置的环境,即某些从节点从其他从节点复制数据,直至Redis 6.0.3版本,可能会遇到数据损坏的问题。我们所说的链式复制是指:

+--------+          +---------+         +-------------+
| master |--------->| replica |-------->| sub-replica |
+--------+          +---------+         +-------------+

正在使用链式复制的用户应尽快从Redis 6.0.0、6.0.1、6.0.2或6.0.3升级至Redis 6.0.4。

需要明确的是,没有采用这种配置,而是仅将从节点直接连接到主节点的用户,应该不会面临任何问题。但我们对6.0.x版本复制实现的复杂性不再有信心,因此建议所有使用旧版6.0.3的用户升级到6.0.4。到目前为止,我们发现的问题都涉及链式复制。

从Redis 6.0.4开始使用的新用户不受影响。使用Redis 5的用户也没有问题。从Redis 5升级到Redis 6.0.4的用户也是安全的。简而言之:问题出在使用6.0.0、6.0.1、6.0.2、6.0.3的用户上。

事实2:仅当您使用链式复制时,从Redis 6.0.x升级到Redis 6.0.4需要额外注意:

  1. 将您的新Redis 6.0.4实例作为当前Redis 6.0.x主节点的从节点附加后,应等待首次全量同步完成,然后立即将其晋升为主节点,如果您的设置涉及链式复制。在主从链接可能中断的情况下,不要让它有时间进行新的部分同步。

  2. 作为额外的预防措施,您可以使用以下命令将复制ping周期设置为一个非常大的值(例如1000000):

    CONFIG SET repl-ping-slave-period 1000000
    

    注意,如果您谨慎地执行了步骤1,那么步骤2就不是必需的。但如果您进行了这一步,请确保稍后将其恢复为默认值:

    CONFIG SET repl-ping-slave-period 10
    

这是Redis 6的主要变化。未来我们将寻找另一种方式来实现“有意义的偏移量”特性所追求的目标,但避免同样的复杂度。

版本中的其他变更包括:

  • 改善PSYNC2测试。
  • 修复了导致活跃碎片整理停滞的罕见边缘情况错误。
  • 修复了Redis 6在32位系统上启动时的断言问题。
  • Redis 6的32位版本现已重新加入我们的测试环境。
  • 修复了使用STRALGO命令导致服务器崩溃的问题。
  • 实现了使用sendfile进行RDB传输。
  • TLS相关修复。
  • 通过检测到协议错误时断开与主节点的连接,增强了复制的健壮性。基本上,我们不再接受来自主节点的内联协议。
  • 测试方面的其他改进。

======================================================

Redis 6.0.3 Released Sat May 16 18:10:21 CEST 2020

======================================================

Upgrade urgency CRITICAL: a crash introduced in 6.0.2 is now fixed.

1eab62f7e 在将主节点缓存之前,从CLOSE_ASAP列表中移除客户端。

======================================================

Redis 6.0.2 Released Fri May 15 22:24:36 CEST 2020

======================================================

Upgrade urgency MODERATE: many not critical bugfixes in different areas.
Critical fix to client side caching when
keys are evicted from the tracking table but
no notifications are sent.

以下是最重要的修复:

  • XPENDING 命令不应更新消费者的最近访问时间
  • 优化了延迟回复的内存使用 - 已修复
  • 修复了Redis服务器外部CRC64初始化的问题
  • stringmatchlen() 函数不应假设字符串以空字符结尾
  • 在集群总线上存在高Pub/Sub负载时,改进了对集群节点可用性的检查
  • Redis基准测试:修复了由于双重释放导致的核心转储问题
  • 跟踪:在逐出条目时发送逐出消息
  • rax.c 更新来自上游antirez/rax的代码
  • 修复了Redis 6.0在加载过程中未释放已关闭连接的问题

新特性:

  • 在Linux/BSD上支持setcpuaffinity
  • 客户端缓存支持:在服务器信息中添加跟踪前缀数量统计
  • 向redis-benchmark.c添加了–user参数(用于ACL)

======================================================

# Redis 6.0.1 Released Sat May 02 00:06:07 CEST 2020

======================================================

Upgrade urgency HIGH: This release fixes a crash when builiding against
Libc malloc.

此处我们撤销了提交8110ba888,该优化由于代码中的一个错误导致了崩溃。在使用默认分配器时不会发生这种情况,因为jemalloc和libc malloc之间存在差异,所以这一问题逃过了我们所有的测试,但后来被用户报告。我们将在后续检查原因后重新添加原本被撤销的优化内容,因为这不是一项关键的优化。

======================================================
Redis 6.0.0 GA Released Thu Apr 30 14:55:02 CEST 2020

Upgrade urgency CRITICAL: many bugs fixed compared to the last release candidate. Better to upgrade if you see things affecting your environment in the changelog.

以下是相比上一个候选版本所做的更改列表:

  • 修复了XCLAIM在AOF/复制中的传播问题。
  • 客户端缓存:新增NOLOOP选项,以避免接收到自己执行的更改通知。
  • ACL的GENPASS现在使用HMAC-SHA256,并有一个可选的"bits"参数。这意味着你可以将其作为一种通用的“安全随机字符串”原语来使用!
  • 集群"SLOTS"子命令的内存优化。
  • LCS命令现在是STRALGO命令的一个子命令。
  • 对于副本也实现了有意义的偏移量。更多的成功的部分重新同步。
  • 优化了延迟回复的内存使用。
  • 更快的CRC64算法,以加速RDB加载速度。
  • XINFO STREAM FULL,一个新的子命令,用来获取整个Stream的状态。
  • 客户端命令CLIENT KILL增加USER 选项。
  • MIGRATE命令增加AUTH2选项,以支持ACL风格的认证。
  • 其他一些随机的错误修复。

======================================================
Redis 6.0-rc4 Released Thu Apr 16 16:10:35 CEST 2020

Upgrade urgency LOW: If you are using RC3 without issues, don’t rush.

这是Redis 6的最新候选发布版本。这很可能会与您在Redis 6正式版中看到的内容非常相似。请对其进行测试并报告任何问题 😃

本次发布的主要变更包括

  • 当使用大量客户端时,INFO命令的执行速度显著提升。
  • 所有阻塞命令的执行速度大幅提高:现在针对同一键的阻塞操作的时间复杂度为O(1),而非之前的O(N)。
  • 过时的副本现在允许使用MULTI/EXEC命令。
  • 新命令:LCS(最长公共子序列)。
  • 添加新配置,使DEL命令表现得像UNLINK一样。
  • 加快RDB文件的加载速度。
  • 修复了许多错误(详细信息请查看本通知末尾的提交消息)

======================================================
Redis 6.0-rc3 Released Tue Mar 31 17:42:39 CEST 2020

Upgrade urgency CRITICAL: A connection management bug introduced with the
SSL implementation can crash Redis easily.

此版本的主要变更清单:

  • 修复了因重构SSL连接代码导致的崩溃问题。
  • 阻塞命令的精确超时设置。现在,无论连接的客户端数量多少,超时时间都有HZ级别的精度。新的超时时间存储在基数树中,并按过期时间排序。
  • 修复了因配置maxclients调整事件循环大小时偶尔出现的崩溃问题。
  • 修复了成功进行部分重同步后systemd就绪状态的问题。
  • Redis-cli增加启动时提示输入密码模式(增强安全性)。
  • 将Keyspace Notifications(键空间通知)功能添加到了MIGRATE和RESTORE命令中。
  • 修复了线程I/O相关的错误。
  • 在Sentinel中实现了新的ACL风格认证方式。
  • 使’requirepass’与Redis 5及更低版本保持更高程度的向后兼容。
  • ACL:即使设置了"nopass",如果默认用户被关闭,则视为禁用。
  • 修复了在Redis集群中升级实例并重启后可能存在的不一致性问题。实例表现为从节点但实际上立即被设置为主节点,但在加载过程中对于已过期键的处理决策却是基于从节点的角度做出的。
  • 在遇到-READONLY错误后终止事务。
  • 对模块API进行了多项不同的修复。
  • 添加BITFIELD_RO命令,允许在只读副本上调用该命令。
  • PSYNC2:实现了有意义的偏移量。允许断开连接但仍向从节点发送PING的原主节点,能成功地向新的从节点进行增量同步,同时丢弃仅包含PING命令的复制积压队列的最后部分。
  • 修复了在Lua脚本处于BUSY状态时管道化的MULTI/EXEC命令。
  • 再次修复了模块中的传播API,此前因其他更改而再次损坏。

======================================================
Redis 6.0 RC2 Released Thu Mar 05 15:40:53 CET 2020

Upgrade urgency MODERATE: Normal bugfixing release of a non-GA branch.
Redis 6 RC2带来了许多修复和新特性,特别是在客户端缓存方面进行了大量改进。
新特性和改进:

  • ACL LOG:记录被拒绝的命令、键访问和认证信息。
  • 客户端缓存重新设计,现在我们使用键而非槽进行缓存。
  • 客户端缓存:实现了广播模式。
  • 客户端缓存:实现了OPTIN/OPTOUT模式。
  • 移除无持久化实例中用于复制的RDB文件(可选配置)。

修复(仅列出部分,完整修复请查看提交记录)

  • 针对边缘情况下的流(Streams)进行了多项修复。
  • 修复了因RESP3变更导致的CLIENT SETNAME命令重复回复问题。
  • 修复了新的主动过期因除以零导致的崩溃问题。
  • 避免Sentinel将提升的从节点变为其自身的从属节点。
  • 修复了当模式以’*'开头紧跟\x00字符时KEYS命令的错误。
  • 线程I/O:现在主线程也会参与执行I/O操作。
  • 对模块API进行了多项修复,并且在接下来的RC版本中会有更多。
  • 如果字符串中间包含\0字符,ld2string应失败。
  • 提高Redis测试的可靠性。
  • 修复SPOP返回nil的问题(见#4709)。注意:此修复涉及API变更。

======================================================
Redis 6.0 RC1 Released Thu Dec 19 09:58:24 CEST 2019

Upgrade urgency LOW: This is the first RC of Redis 6.

Introduction to the Redis 6 release

Redis 6在多个关键领域对Redis进行了改进,是项目历史上规模较大的版本之一,因此这里仅列出此版本中的主要特性:

  • 模块块系统新增了一系列API,使得模块作者能够实现过去不可能做到的事情。现在可以在RDB文件中存储任意模块私有数据,挂载不同服务器事件,捕获和重写入命令执行,基于键阻塞客户端等。
  • 主动过期机制被重写,加快了已过期键的剔除速度。现在,这项工作强度是可调优的。
  • Redis现在支持所有频道上的SSL。
  • ACL支持,可以定义只能运行特定命令和/或仅能访问特定键模式的用户。
  • Redis现在支持一种名为RESP3的新协议,返回更语义回复:使用此协议的新客户端仅从回复就能理解应返回给程序的类型。
  • 服务器端支持客户端侧键值缓存。此功能仍处于实验阶段,在接下来的发布候选版本中将有更多的改动,但你现在就可以测试并阅读相关内容:Redis.io/topics/client-side-caching
  • Redis现在可以选择性地使用线程处理I/O,允许在单个实例中每秒服务的操作数量翻倍,当无法使用管道时。
  • 无盘复制现在甚至在副本上也受支持:在一定条件下,用户可以配置副本首次同步时直接通过套接字将RDB加载到内存中。
  • Redis-benchmark现在支持Redis集群模式。
  • SRANDMEMBER等命令具有更好的分布。
  • Redis-cli改进。
  • Systemd支持重写。
  • 发布了Redis集群代理:github.com/artix75/redis-cluster-proxy
  • 发布了Redis的Disque模块:github.com/antirez-module

Migrating from 5.0 to 6.0

在升级你的应用程序从 Redis 5.0 到 6.0 时,Redis 6.0 版本大体上是 5.0 版本的一个超集,因此你应不会遇到大的问题。然而,6.0 版本确实引入了一些小的非向后兼容变更,以下是其中之一:

  • 对于命令 SPOP <key> <count>,当集合键不存在时,其行为发生了变化。在此之前,如果集合不存在,该命令会返回 null。而在 Redis 6.0 中,即使集合不存在,当使用带有计数参数(包括非零值)调用时,它也会正确地返回一个空集合,就像使用 0 作为参数调用时一样。这一改动从技术角度讲是一种修复,因为它使得命令的行为更加一致和符合预期,但确实改变了以往的错误行为。

因此,在计划升级时,如果你的代码逻辑依赖于 SPOP 在键不存在时返回 null 的特性,你可能需要对此进行相应的调整,以适应 Redis 6.0 的这一变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值