一、Redis 6.2 RC1发布

2020年12月14日,Redis发布了6.2的第一个RC版本,是Redis作者antirez”辞职“后,由Redis核心团队发布的第一个版本。该版本没有太多惊艳新的特性(比如Redis 6.0提供了多线程、ACL、RESP3等等),但提供了很多新的命令和功能改进,其中比较重要的有几个:

  • 一些新的命令:SMISMEMBER、ZMSCORE、LMOVE、GEOSEARCH(支持按照矩形搜索,阿里云团队开发)等

  • rehash可能造成的evict问题(小概率问题,但确实比较难查,在一个Redis最好存多少key文章中有提到)

  • 在info里加了一些新的东西:比如读写量(方便计算读写比)、将main thread和io thread的cpu单独计算、total_forks

  • 在一些新的硬件架构做了很多优化:ARM、树莓派

  • 去掉了Redis6对高版本GCC的要求

  • 当然也修复了一些bug

二、新的命令

  • 添加SMISMEMBER命令:原子批量的sismember(#7615)
  • 添加ZMSCORE命令:原子批量zscore(#7593)
  • 添加LMOVE和BLMOVE命令:用来代替RPOPLPUSH(6.2后被废弃)(#6929)
  • 添加RESET命令可以重置客户端连接状态(#7982)
  • 添加COPY命令:复制key(#7953)
  • 添加ZDIFF和ZDIFFSTORE命令(#7961)
  • 添加ZINTER和ZUNION命令(#7794)
  • 添加GEOSEARCH/GEOSEARCHSTORE命令:GEO可以基于方形搜索(之前是基于半径)(#8094) 
  • 将GET参数添加到SET命令,以获得更强大的GETSET(GETSET在6.2后被废弃)(#7852)
  • 向XPENDING、X[REV]RANGE添加专有范围查询(#8130 #8072)
  • 为ZADD添加GT和LT选项以进行条件分数更新(#7818)
  • client info和list接口支持指定ids(#8113)
  • 在XPENDING命令中添加IDLE参数(#7972)
  • 将本地地址添加到CLIENT LIST和CLIENT KILL过滤器。(#7913)
  • 将NOMKSTREAM选项添加到XADD命令(#7910)
  • 将命令command添加到Sentinel(#7940)
  • 添加SENTINEL MYID子命令(#7858)

三、新的功能

1.server端新的功能:

  • 优化dump逻辑,防止有可能造成的crash(#7807)
  • ACL支持:pub/sub(#7993)
  • ACL支持:sentinel(#7888)
  • 支持同时从stdin和文件中获取配置,避免将机密信息存储在磁盘上(#7893)

2.客户端工具中的新功能:

  • redis-cli RESP3推送支持(#7609)
  • redis-cli 增加askpass和cluster-from-askpass选项(#7994)
  • redis-cli 能够提供用户名和密码的URI(#8048)
  • redis-cli / redis-benchmark允许指定首选密码/密码套件(#8005)
  • redis-cli 增加-e选项可在命令执行失败时与代码一起退出(#8136)

四、改进

1. 命令的行为更改:

  • EXISTS命令不会更改LRU(#8016)
  • object命令不触发过期(LOOKUP_NOTOUCH|LOOKUP_NONOTIFY)(#8016)
  • 改善SELECT和MOVE的数据库ID范围检查(#8085)
  • 修改AUTH/HELLO错误消息文本(#7648)
  • BITOPS长度限制定义为一个宏(proto_max_bulk_len)(#8096)
  • 如果Redis超出内存限制,则GEORADIUS[BYMEMBER]可以返回 -OOM错误(#8107)

2.其他的行为更改:

  • (可选)如果请求的绑定地址不可用,则默认启动失败(#7936)
  • 解决rehash在大量key-value下内存增加导致的数据剔除(#7954)
  • CONFIG REWRITE变为原子且更安全的,但需要对配置文件的文件夹(#7824,#8051)具有写访问权
  • 使用新的增量逐出机制,可减少逐出峰值的延迟:详见maxmemory-eviction-tenacity配置(#7653)
  • 使用命令行参数启动Redis时,不重置save所保存的配置。(#7092)
  • 在加载期间更新INFO的内存指标(#7690)
  • 启用“supervised”配置时,它的优先级高于“daemonize”。(#8036)
  • 在SIGABRT上添加了崩溃日志报告,而不是退出(#8004)
  • 禁用THP(大内存页),如果启用的话(#7381)

3.info字段改进

  • info中添加无盘复制进度信息(#7981)
  • 将主线程cpu时间添加到INFO字段。(#8132)
  • 将total_forks添加到INFO STATS字段(#8155)
  • 将maxclients和cluster_connections添加到INFO CLIENTS字段(#7979)
  • 在客户端列表中添加跟踪bcast标志和客户端重定向标志(#7995)
  • 修复 INFO client_recent_max_input_buffer字段中的相关问题(#8065,参见#7874)
  • 添加total_reads_processed和total_writes_processed方便计算读写比

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

+(可选)使用 H/W Monotonic clock(硬件单调时钟)进行更快的时间采样,默认情况不是该时钟(#7644)

  • 删除对C11和_Atomic支持的编译器的要求,可以在老版本系统上更轻松的编译和调试(#7707)
  • 修正了崩溃日志在ARM上的输出。(#8020)
  • 修复在树莓派上编译的bug。(#8095)
  • 支持在Haiku操作系统上设置进程标题。(#8060)
  • 支持DragonFlyBSD RSS内存采样。(#8023)

5. 新的配置选项:

  • 启用标准openssl.cnf配置OpenSSL(#8143)
  • oom-score-adj-values现在可以接受绝对值(相对值除外)(#8046)
  • TLS:添加其他客户端证书支持。(#8076)

6.模块API更改:

  • 添加CTX_FLAGS_DENY_BLOCKING作为统一的方式来了解是否允许阻塞(#8025)
  • 为惰性删除及其代价计算函数添加数据类型回调(#7912)
  • 为COPY命令添加数据类型回调(#8112)
  • 添加回调函数以进行碎片整理。(#8149)
  • 为repl-diskless-load swapdb添加模块事件(#8153)

7.模块相关bug:

  • 移动了RMAPI_FUNC_SUPPORTED使其可用(#8037)
  • 提高计时器精度(#7987)
  • 在RM_CreateStringPrintf的结果中允许出现'\0'(#6260)

8.其他改进:

  • 在Redis基准测试中,增加TLS支持(#7959)
  • 加速无盘主连接和常规重新连接(#6271)
  • 在block状态/loading状态时运行主动碎片整理(#7726)
  • 性能和内存报告改进——sds控制其自身碎片(#7875)
  • 加速群集故障转移(#7948)

五、Bug修复

  • 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)

六、升级

Redis 6.2主要是6.0的严格超集,对于使用者来说,从6.0升级到6.2没什么太大问题。对于运维人员来说,Redis6.2增加了很多新的监控信息,对做了一些运维的优化,而且对于编译环境的要求降低了,使得其易用性和可维护性提高。同时修复了一些已知的问题,并且没有对代码进行大范围的改进,对于稳定性上有一定的提高。

我个人的经验:没太多想要的特性,不要着急升级;没太紧急的bug,不要着急升级;新的Redis团队的代码质量需要经过考验,不要着急升级,至少等release几个小版本后.


广告:


职位:Redis内核开发工程师、开发运维工程师

公司:快手(北京)

薪资:30~60K(16薪)+ 期权

联系人:付磊(微信 carlosfu)

关键::百万级Redis实例Paas平台、异地多活开发、冷热存储开发、代理中间件开发、



职位描述

1.负责亿万级Cache存储集群,支撑核心业务。
2.负责Cache异地多活的设计、研发等工作。
3.深入理解业务场景的存储需求,与业务合作寻找最合适的存储方案。
4.探索运维自动化和智能化技术和方向。

任职要求

1.计算机或相关专业本科及以上学历-熟练使用C、C++、Java开发语言优先,具备良好的编程基础,对工程质量有很高的自我要求。
2.参与过大型异地多活系统的设计、研发工作优先。
3.熟悉Redis、Memcached、RocksDB、其他KV存储一种,开源社区活跃者或贡献者优先。
4.具备较强的学习能力和逻辑思维,追求极致。