您现在的位置是:首页 >技术教程 >Redis 异步机制网站首页技术教程
Redis 异步机制
简介Redis 异步机制
影响 Redis 性能的潜在因素 :
- Redis 内部的阻塞式操作
- CPU 核和 NUMA 架构的影响
- Redis 关键系统配置
- Redis 内存碎片
- Redis 缓冲区
阻塞点
Redis 交互点 :
- 客户端 : 网络 IO,键值对增删改查操作,数据库操作
- 磁盘 : 生成 RDB 快照,记录 AOF 日志,AOF 日志重写
- 主从节点 : 主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数据库、加载 RDB 文件
- 切片集群实例 : 向其他实例传输哈希槽信息,数据迁移
交互点/操作点 :
阻塞点:
- 集合全量查询 , 聚合操作
- bigkey 删除
- 清空数据库
- AOF 日志同步写
- 从库加载 RDB 文件
客户端
客户端交互 :
- Redis 用 IO 多路复用机制,避免主线程一直等待网络连接,所以,网络 IO 不会阻塞 Redis
- 集合全量查询 (HGETALL , SMEMBERS) , 聚合操作 , 阻塞主线程
- bigkey 删除 , 阻塞主线程
删除性能 :
- 当数量从 10 万到 100 万时,删除时间的增长到了 20 倍
- 集合元素越大,删除时间越长
- Redis 的响应时间一般在微秒级别,当操作上 2s时,必然会阻塞主线程
磁盘
Redis 用子进程生成 RDB ,重写 AOF , 不会阻塞主线程
- 阻塞点 : Redis 记录 AOF 时 , 同步写磁盘 , 耗时较大 (1 ~ 2 ms)
主从
主从集群中,主库要生成 RDB 文件,并传输给从库
- 主库创建/ 传输 RDB 都是由子进程完成,不会阻塞主线程
- 阻塞点 : 从库会
FLUSHDB
清空数据库 - 阻塞点 :从库还要记载 RDB 到内存中 , RDB 越大 , 越慢
切片
Redis 切片用 Redis Cluster ,当迁移 bigkey 时,会阻塞主线程,因为 Redis Cluster 用同步迁移
异步
Redis 异步线程机制 : 把任务给子线程,并在后台完成
关键操作例子 :
- 主线程收到操作 1 后,操作 1 不用返回数据 , 返回 OK,并给后台子线程完成
- 主线程收到操作 2,而操作 2 要返回数据,就必须要主线程执行
分析异步操作 :
- 读操作 (集合全量查询 , 聚合查询) : 都是读操作 , 就必须要主线程执行
- 删除操作 (bigkey 删除 , 清空数据库) : 不用返回数据 , 能异步执行
- AOF 同步写 : 不用返回数据 , 能异步执行
- 从库记载 RDB : 从库要对外服务 , 就必须要加载完毕 , 就必须要主线程执行
子线程
Redis 主线程启动后 , pthread_create
会创建 3 个子进程 :
- AOF 写操作
- 键值对删除
- 文件关闭
异步子线程执行机制 :
- 主线程通过链表的任务队列 , 与子线程交互。当收到删除键值对 , 清空数据库的操作时,主线程会把该操作封装成任务,并放入到任务队列中,并返回给客户端个完成信息
- 惰性删除 (lazy free) : 子线程从任务队列中读取任务后,才实际删除键值对
- AOF 配置
everysec
: 子线程读取任务后,才写入 AOF
Redis 4.0 后提供异步删除键值对 , 清空数据库
UNLINK
: 集合有大量元素删除 (如 : 百万级别或千万级别)FLUSHDB ASYNC
,FLUSHALL AYSNC
: 异步清空数据库
Redis 4.0 前,进行 bigkey 删除
- 用集合
SCAN
读取部分数据,再DEL
删除。避免一次性删除大量 key 阻塞主线程 - 集合全量 , 聚合查询 :用
SCAN
,分批读取数据,再在客户端进行聚合计算 - 从库加载 RDB 文件:把主库的大小控制在 2~4GB 左右,保证 RDB 能较快加载
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。