基本概念
-
redis影响性能因素
-
Redis 内部的阻塞式操作\
-
CPU 核和 NUMA 架构的影响\
-
Redis 关键系统配置\
-
Redis 内存碎片\
-
Redis 缓冲区
-
Redis 实例有哪些阻塞点?
-
redis操作交互
-
客户端:
- 网络 IO
- 键值对增删改查操作
- 数据库操作\
-
磁盘
- 生成RDB快照
- 记录AOF操作日志
- AOF操作日志重写\
-
主从节点
-
主库生成\
-
传输 RDB 文件\
-
从库接收 RDB 文件\
-
清空数据库\
-
加载 RDB 文件
-
-
切片集群实例\
- 数据迁移\
-
-
-
和客户端交互时的阻塞点\
-
网络io慢 使用IO多路复用
-
增删改查操作 如果复杂度高的增删改查肯定会阻塞Redis\
-
阻塞点1:对集合的全量查询 例如查询操作 HGETALL、SMEMBERS
-
阻塞点1: 集合的聚合统计操作
-
删除操作
-
需要释放占用的内存空间
-
操作系统需要把释放掉的内存块插入一个空闲内存块的链表\
-
会阻塞当前释放内存的应用程序\
-
阻塞点2: bigkey 删除会导致主线程阻塞
-
**阻塞点3: 清空数据库
**
-
-
-
-
-
和磁盘交互时的阻塞点\
-
子进程的方式生成 RDB 快照文件\
-
子进程执行 AOF 日志重写操作\
-
阻塞点4: AOF 日志同步写\
-
-
-
主从节点交互时的阻塞点\
-
主库在复制的过程中,创建和传输 RDB 文件都是由子进程来完成的,不会阻塞主线程\
-
但是从库会执行FLUSHDB,阻塞点3
-
加载大RDB是阻塞点5
-
-
-
切片集群实例交互时的阻塞点\
- hash槽迁移,数据迁移是渐进式执行,所以一般不会阻塞
- Redis Cluster 方案+bigkey会造成阻塞\
-
-
阻塞点
-
集合全量查询和聚合操作\
-
bigkey 删除\
-
清空数据库\
-
AOF 日志同步写\
-
从库加载 RDB 文件
-
哪些阻塞点可以异步执行?
-
梳理
-
【同步】读操作是典型的关键路径操作 不能异步\
-
【异步】bigkey 删除和清空数据库可以选择进行异步执行\
-
UNLINK 删除命令\
-
FLUSHDB 和 FLUSHALL 命令后加上 ASYNC 选项\
-
-
【异步】AOF 日志的写
-
【同步】从库加载 RDB 文件\
-
-
子线程
-
AOF 日志写操作\
-
键值对删除\
- 惰性删除\
-
文件关闭的异步执行
-
小结
-
Redis 实例运行时的 4 大类交互对象:客户端、磁盘、主从库实例、切片集群实例\
-
5大阻塞
-
【同步】集合全量查询和聚合操作\
-
【异步】bigkey 删除\
- UNLINK异步 redis4.0后
- SCAN 命令读取数据,然后再进行删除\
-
【异步】清空数据库\
-
【异步】AOF 日志同步写\
-
【同步】从库加载 RDB 文件\
-
-
一些建议
-
可以使用 SCAN 命令,分批读取数据,再在客户端进行聚合计算\
-
把主库的数据量大小控制在 2~4GB 左右,以保证 RDB 文件能以较快的速度加载\
-
\