Redis7.0 新特性(超详细)

一 前言

从 2022 年 1 月 31 日发布了 Redis 7.0 RC1 开始,经过几个 RC 版本的快速上线。Redis 7.0.0 GA 版于 2022 年 4 月 27 日正式发布,代表 Redis7.0 进入了稳定版(Stable)时代。

本文将针对 Redis 7.0 的新特性进行展开,尝尝鲜。

二 配置项变动

2.1 多AOF文件支持

7.0 版本中一个比较大的变化就是 aof 文件由一个变成了多个,主要分为两种类型:基本文件(base files)、增量文件(incr files),请注意这些文件名称是复数形式说明每一类文件不仅仅只有一个。
在此之外还引入了一个清单文件(manifest) 用于跟踪文件以及文件的创建和应用顺序(恢复)。

redis.config 中对应的配置项:

// 几种类型文件的前缀,后跟有关序列和类型的附加信息
appendfilename "appendonly.aof"

// 新版本增加的目录配置项目
appenddirname "appendonlydir"

// 如有下的aof文件存在
1. 基本文件
	appendonly.aof.1.base.rdb 
2. 增量文件	
	appendonly.aof.1.incr.aof
	appendonly.aof.2.incr.aof
3. 清单文件	
	appendonly.aof.manifest 

2.2 config 命令增强

CONFIG SET/GET 可以在一次调用中处理多个配置,注意 CONFIG GET 响应以不确定的顺序返回。

2.3 限制客户端内存使用

增加允许限制所有客户端的总内存使用量配置项,redis.config 中对应的配置项:

// 两种配置形式:指定内存大小、基于 maxmemory 的百分比。
maxmemory-clients 1g
maxmemory-clients 10%

2.4 listpack 紧凑列表

listpack 是用来替代 ziplist 的新数据结构,在 7.0 版本已经没有 ziplist 的配置了(6.0版本仅部分数据类型作为过渡阶段在使用)。想了解 ziplist 的可以看文章《ziplist - 压缩列表》。

redis.config 中对应的配置项:

// 下面配置代表 listpack 已经替换了 ziplist 类似 hash-max-ziplist-entries 的配置了。
list-max-listpack-size -2

hash-max-listpack-entries 512
hash-max-listpack-value 64

zset-max-listpack-entries 128
zset-max-listpack-value 64

2.5 传出连接绑定

增加了传出连接(从副本到主服务器,从Sentinel到实例,集群总线等)的绑定配置项,redis.config 中对应的配置项:

bind-source-addr 10.0.0.1

2.6 等待副本关闭超时

在关闭期间,宽限期允许任何滞后的复制副本跟上主服务器存在之前的最新复制偏移量。这个时期可以防止数据丢失,尤其是对于没有配置磁盘备份的部署。

“关机超时”值是宽限期的持续时间(秒)。这是仅当实例有副本时适用。要禁用该功能,请设置该值为0。

shutdown-timeout 10

2.7 其他变动

1. busy-reply-threshold 替换 lua-time-limit 
2. 增加集群相关配置项:
	cluster-port  // 控制集群总线的绑定端口
	cluster-announce-hostname
	cluster-preferred-endpoint-type
	cluster-allow-pubsublocal-when-down
	cluster-link-sendbuf-limit

三 redis-cli 工具变动

redis-cli --json, and -2 
redis-cli --scan // 添加睡眠间隔选项
redis-cli --replica // 跳过 RDB 生成从而得到优化
redis-cli --functions-rdb // 仅使用函数生成 RDB
redis-cli -X // 从stdin中获取任意参数 ,集群中使用:take -x 

变动:
1. 可以用Ctrl+C中止monitor和pubsub,但保持cli活动。

四 命令新增和变动

4.1 Zset (有序集合)

有序集合增加 ZMPOP、BZMPOP、ZINTERCARD 等命令 。

ZMPOP 从提供的键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对。

e.g :

redis:6379> ZMPOP 1 notsuchkey MIN
(nil)
redis:6379> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
redis:6379> ZMPOP 1 myzset MIN
(nil)
redis:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis:6379> ZMPOP 1 myzset MAX COUNT 10
(nil)
redis:6379> ZADD myzset2 4 "four" 5 "five" 6 "six"
(integer) 3
redis:6379> ZMPOP 2 myzset myzset2 MIN COUNT 10
(nil)
redis:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis:6379> ZMPOP 2 myzset myzset2 MAX COUNT 10
(nil)
redis:6379> ZRANGE myzset2 0 -1 WITHSCORES
1) "four"
2) "4"
3) "five"
4) "5"
5) "six"
6) "6"
redis:6379> EXISTS myzset myzset2
(integer) 2
redis:6379> 

BZMPOP 为 ZMPOP 阻塞变体。

ZINTERCARD 此命令类似于ZINTER,但它不返回结果集,而只返回结果的基数。

e.g :

redis:6379> ZADD zset1 1 "one"
(integer) 1
redis:6379> ZADD zset1 2 "two"
(integer) 1
redis:6379> ZADD zset2 1 "one"
(integer) 1
redis:6379> ZADD zset2 2 "two"
(integer) 1
redis:6379> ZADD zset2 3 "three"
(integer) 1
redis:6379> ZINTER 2 zset1 zset2
(empty array)
redis:6379> ZINTERCARD 2 zset1 zset2
(integer) 0
redis:6379> ZINTERCARD 2 zset1 zset2 LIMIT 1
(integer) 0
redis:6379> 

4.2 Set (集合)

增加 SINTERCARD 命令,似于SINTER(返回由所有给定集合的交集产生的集合成员),但它不返回结果集,而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数。

e.g :

redis:6379> SADD key1 "a"
(integer) 1
redis:6379> SADD key1 "b"
(integer) 1
redis:6379> SADD key1 "c"
(integer) 1
redis:6379> SADD key1 "d"
(integer) 1
redis:6379> SADD key2 "c"
(integer) 1
redis:6379> SADD key2 "d"
(integer) 1
redis:6379> SADD key2 "e"
(integer) 1
redis:6379> SINTER key1 key2
1) "c"
2) "d"
redis:6379> SINTERCARD 2 key1 key2
(integer) 0
redis:6379> SINTERCARD 2 key1 key2 LIMIT 1
(integer) 0
redis:6379> 

4.3 LIST (列表)

增加 LMPOP、BLMPOP ,从提供的键名列表中的第一个非空列表键中弹出一个或多个元素。

4.4 有效期设置变动

增加 PEXPIRETIME 、EXPIRETIME,EXPIRE 命令组支持 NX/XX/GT/LT 选项。

EXPIRETIME 返回给定密钥将过期的绝对 Unix 时间戳。
-1 如果密钥存在但没有关联的过期时间,则该命令返回。
-2 如果密钥不存在,该命令将返回。

e.g :

redis:6379> SET mykey "Hello"
"OK"
redis:6379> EXPIREAT mykey 33177117420
(integer) 1
redis:6379> EXPIRETIME mykey
(integer) 33177117420
redis:6379> 

PEXPIRETIME 与EXPIRETIME相似,不过是以毫秒返回。

EXPIRE
NX-- 只有当 key 没有过期时才设置过期
XX-- 仅当 key 已过期时才设置过期
GT-- 仅当新的到期时间大于当前到期时间时才设置到期时间
LT-- 仅在新到期时间小于当前到期时设置到期

4.5 SET

2.6.12 开始:添加了、EX和PX选项。
6.0.0 开始:添加了该KEEPTTL选项。
6.2.0 开始:添加了GET,EXAT和PXAT选项。
7.0.0 开始:允许 NX 和 GET 选项一起使用。

EX seconds -- 设置指定的过期时间,以秒为单位。
PX 毫秒——设置指定的过期时间,以毫秒为单位。
EXAT timestamp-seconds -- 设置密钥过期的指定 Unix 时间,以秒为单位。
PXAT timestamp-milliseconds -- 设置密钥过期的指定 Unix 时间,以毫秒为单位。
NX-- 仅当密钥不存在时才设置它。
XX-- 仅当密钥已存在时才设置它。
KEEPTTL-- 保留与密钥关联的生存时间。
GET-- 返回存储在 key 中的旧字符串,如果 key 不存在,则返回 nil。SET如果存储在 key 的值不是字符串,则返回并中止错误。

由于SET命令选项可以替换SETNX, SETEX, PSETEX, GETSET,因此在未来的 Redis 版本中,这些命令可能会被弃用并最终被删除。

五 INFO 命令信息调整

INFO stats: 增加 aof_rewrites 和 rdb_snapshots 统计
INFO stats: 增加 reply_buffer_shrinks 和 reply_buffer_expends
INFO modules: 增加 no-implicit-signal-modified 模块
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: 删除 aof_rewrite_buffer_length 
MEMORY STATS: 在集群模式中报告插槽到键的映射大小。
INFO MEMORY: 更改了函数和EVAL的单独内存使用。
INFO MEMORY: 增加 mem_total_replication_buffers, 改变 mem_clients_slaves 的含义。

六 性能资源利用率、安全、等改进

这些是整理更新得到的部分优化改动。

1. 在集群模式下显着节省内存和延迟改进 。
2. 在许多散列或 zset 键的情况下显着节省内存。
3. 复制积压和副本使用一个全局共享复制缓冲。
4. 显着减少写时复制内存开。
5. 释放集群发送缓冲区中未使用的容。
6. 内存效率,充分利用用于回复缓冲区的客户端结构内存 。
7. 将 ziplist 替换为 Hash、List、Zset 中的 listpack。
8. 添加对列表类型的支持以存储大于 4GB 的元素 。
9. 重用模块阻塞客户端的临时客户端对象 。
10. 删除命令参数计数限制,动态增加 argv 缓冲区 。
11. 优化列表类型操作以从最近端查找 。
12. 改进 fsync 以避免大量写入到磁盘。
13. BITSET 和 BITFIELD SET 仅在值实际更改时传播 。
14. 当客户端被模块计时器解除阻塞时改善延迟。
15. 当 redis 从空启动时始终创建一个基本 AOF 文件。
16. 本在 repl-diskless-load 期间继续提供数据= swapdb 以提高可用性 。
17. Redis 7 对 RDB 文件使用了新的 10 版本格式,改版本与旧版本不兼容。
18. 加载较旧的 RDB 格式时将 ziplist 编码的密钥动态转换为 listpacks 。转换适用于从磁盘加载文件或从 Redis 主服务器复制,并且会稍微增加加载时间。

// 安全性改进
19. redis-cli:敏感命令绕过历史文件。
20. 敏感配置和命令默认被阻止。  

七 总结

本文从配置项改动、redis-cli工具、命令变动、INFO命令等方面对 Redis7.0 的改动进行了一个较为详细的讲解。

文中只罗列了经常使用到或者需要关注的条目,更多想起的改动请查阅文档

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Redis是一个开源的、使用C语言编写的高性能键值对存储数据库,其源码注释主要包含了对Redis的各个组件、模块、函数等的详细说明,方便开发者理解和使用Redis。 在Redis 7.0的源码注释中,包含了对Redis的基本结构、数据类型、内存管理、数据库操作、网络通信等方面的注释。 在基本结构方面,源码注释详细介绍了Redis的整体架构和模块之间的关系,如服务器结构、客户端结构、数据库结构等。这些注释帮助开发者了解Redis的组成部分,有助于对Redis进行二次开发和定制化。 在数据类型方面,可以找到对Redis支持的各种数据类型(如字符串、列表、哈希表、有序集合等)的源码注释。这些注释详细说明了数据类型的实现原理和内部数据结构,以及对应操作的时间复杂度等信息,有助于开发者在使用Redis时了解其内部实现机制和使用方法。 在内存管理方面,Redis源码注释解释了Redis对内存的分配和释放,并介绍了部分内存管理的原理和策略,如对象引用计数、内存回收等。这些注释可以帮助开发者理解Redis在内存管理方面的设计和优化。 在数据库操作方面,Redis源码注释提供了对数据库的增删改查操作的详细注释,包括对集合操作、哈希表操作、有序集合操作等。这些注释可以帮助开发者了解Redis对数据的存储和操作方式,以及相应的数据结构和算法。 在网络通信方面,Redis源码注释包含了对网络连接、通信协议、命令解析等的详细说明。这些注释帮助开发者了解Redis与客户端之间的通信机制,以及如何解析和处理客户端发送的命令。 总之,Redis 7.0源码注释提供了对Redis各个方面的详细解释,帮助开发者理解Redis的内部结构、实现原理和使用方式,是开发者学习和使用Redis的重要参考资料。 ### 回答2: Redis 7.0是一款开源的、高性能的、支持多种数据结构的内存数据库。在Redis 7.0的源码注释中,涉及了许多关键的实现细节、数据结构定义和算法逻辑。 首先,Redis 7.0的源码注释提供了对各个函数和模块的详细解释。这些注释能够帮助开发人员更好地理解代码的功能和实现方式,提供了方便的参考和指导。例如,对于关键数据结构如字符串、哈希表、链表等的定义和使用都有详细的注释说明,帮助开发人员了解其内部实现原理和使用方式。 其次,Redis 7.0的源码注释还包含了算法的解释和优化思路。对于一些关键算法,如缓存淘汰算法、订阅与发布算法等,注释中详细解释了其实现原理和性能优化的思路。这对于开发人员来说是非常有价值的,可以帮助他们更好地理解和改进Redis的性能和功能。 此外,Redis 7.0的源码注释还包括了对一些重要模块和功能的解释。例如,对于多线程支持的相关代码和模块,注释中详细解释了其原理和使用方式,以及相关的并发控制策略。这可以帮助开发人员更好地理解和使用Redis的多线程功能,提高系统的并发处理能力。 总而言之,Redis 7.0源码注释对于开发人员来说是一份非常宝贵的文档。它提供了对代码的详细解释和说明,包括数据结构定义、算法实现和模块功能等方面。这些注释可以帮助开发人员更加深入地理解和使用Redis,并为他们在解决问题和优化性能时提供有价值的参考和指导。 ### 回答3: Redis 7.0 是 Redis 数据库的一个版本,以下是对该版本源码注释的简要解释: Redis 7.0 的源码注释主要用于解释 Redis 数据库中的各个函数、数据结构和算法的功能和实现原理。 在 Redis 7.0 的源码中,注释被用来解释函数的输入参数和返回值、函数的作用、关键算法的实现细节以及代码的逻辑结构等等。注释帮助开发者理解和使用源码,对于对 Redis 进行二次开发或者进行排错、优化也起到了重要作用。 源码注释提供了对 Redis 各个模块和功能的清晰解释,例如底层的数据类型实现、线程模型、COW(copy-on-write)策略等等。同时,注释还覆盖了 Redis 7.0 引入的功能和改进。例如,Redis 7.0 可能引入了的数据结构或者命令,这些功能的实现细节可能在注释中有所描述。 此外,Redis 7.0 的源码注释还可能包含一些重要的注释块,其中包括一些算法和数据结构的详细解释,这有助于开发者深入了解 Redis 内部的运作方式。 需要注意的是,Redis 7.0 的源码注释是用来帮助开发者理解源码的,因此在实际运行时会被编译器忽略掉。因此,在阅读和使用源码时,我们需要同时参考源码注释和实际代码实现来全面理解 Redis 的工作机制。 总之,Redis 7.0 的源码注释对于开发者来说是一份重要的参考资料,能够帮助他们理解 Redis 的工作原理和实现方式,从而更好地使用和扩展 Redis 数据库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooddance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值