一、redis 6 新特性¶
1、多线程IO
2、重新设计了客户端缓存功能
3、RESP3协议
4、支持SSL
5、ACL权限控制
6、提升了RDB日志加载速度
7、发布官方的Redis集群代理模块 Redis Cluster proxy。
8、提供了众多的新模块(modules)API
视频补充:其中几个新特性的理解
-
RESP3 是 Redis 在 RESP2 之后的新协议版本,能够更好地表达复杂返回类型。
-
Redis Cluster proxy 可以理解为官方提供的集群代理层,客户端通过代理访问集群时,不需要感知具体节点数量、主从角色和转发细节。
-
客户端缓存功能的重新设计,本质上是为了降低重复读取压力,进一步提升热点数据场景下的访问效率。
1.1 线程模型¶
redis的IO模型 Redis将一次命令执行拆分为三个阶段:
-
read I/O 从网络缓冲区读取命令
-
命令执行
-
write I/O 将执行结果写入到网络缓冲区

为什么要引入多线程模型?
-
随着硬件性能提升,Redis 的性能瓶颈可能出现网络 IO 的读写。
-
读写网络的 read/write 系统调用占用了Redis 执行期间大部分CPU 时间;
-
Redis 采用多个 IO 线程来处理网络请求,提高网络请求处理的并行度。
视频补充:Redis 6 多线程模型的关键边界
-
多线程主要用于 read I/O、write I/O 和协议解析,命令执行本身仍然由主线程串行完成。
-
这样设计的目的是把耗时的网络读写从主线程中剥离出去,但避免多线程同时执行命令带来的锁竞争和实现复杂度。
-
可以把一次请求理解为三个阶段:主线程接收事件 -> I/O 线程处理读写 -> 主线程执行命令并回写结果。
-
因此 Redis 6 以后不再是“纯单线程”,但核心的数据读写命令语义仍然是单线程串行执行。
如何开启?
Redis 6.0 的多线程默认是禁用的,只使用主线程。如需开启需要修改 redis.conf 配置文件: io-threads-do-reads yes
io-threads 4
建议:4 核的机器建议设置为 2 或 3 个线程,8核的建议设置为 6 个线程,线程数一定要小于机器核数。 超过8个无意义
- I/O 线程数并不是越多越好,通常只需要小于 CPU 核数即可,线程过多反而会带来调度开销。
二、redis 7 新特性¶
-
新增Function自定义函数库,函数库支持持久化与可复制。
-
Lua脚本(脚本本身代码)不再支持持久化和复制,仅对命令执行结果进行持久化和复制。
-
ACL v2 支持。
-
支持Multi-Part AOF。
-
支持Client-Eviction。
-
支持Sharded-Pub/Sub。
-
支持命令执行耗时直方图。
-
支持子命令级别的性能统计。
-
Ziplist编码替换为Listpack编码。
-
支持Global Replication Buffer。
2.1 Redis Functions¶
Functions 被设计为redis DB的一部门,可以通过持久化和主从复制保证可用用,不用依赖于客户端。
-
服务端维护functions脚本(只要更新了,客户就一致了,业务的一致性得到保证)
-
服务端持久化functions脚本(脚本不会丢失,事务的失败率降低)会通过主从同步到从库
-
functions内可以调用其他functions
2.2 ACL v2支持¶
Redis 7.0 中, ACL v2 正式支持粒度至 KEY 的权限访问控制,可以轻松实现账户对不同 KEY 有不同的权限 访问控制。

2.3 多AOF支持(Multi-Part AOF)¶
redis 7.0中将原来的单个AOF文件拆分成多个AOF文件。 在Multi-Part AOF 中,将AOF分为三种类型:
-
BASE: 表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。
-
INCR: 表示增量AOF, 它一般会在重写开始执行时被创建,该文件可能存在多个。
-
HISTORY:表示历史AOF,它由BASE和INCR变化而来,每次重写完成时,本次重写之前的BASE和 INCR都将变为HISTORY ,该类型的AOF会被redis自动删除
appenddirname "appendonlydir"
aof-timestamp-enabled
appendonly.aof.1.base.rdb
appendonly.aof.1.incr.aof
appendonly.aof.2.incr.aof
appendonly.aof.manifest

2.4 Client-Eviction(客户端回收)¶
Redis 内存占用主要分为三个部分:
-
data 是用户数据的内存占用;
-
metadata 是元数据的内存占用;
-
client buffer 是连接内存占用
在 redis 7.0 中,可以通过 maxmemory-clients 对客户端连接占用的总内存进行控制。如果连接内存超过配置上限,会优先回收内存占用较大的连接,从而在一定程度上实现连接内存与数据内存的隔离。
视频补充:Client-Eviction 的价值
-
早期更容易把注意力放在 data 上,但在连接数很多、输出缓冲区很大的场景下,client buffer 也可能成为显著的内存消耗来源。
-
Client-Eviction 的重点不是淘汰业务数据,而是优先治理“占内存很多的客户端连接”,避免连接内存把实例整体内存挤爆。
