您现在的位置是:首页 >技术教程 >Redis 异步机制网站首页技术教程

Redis 异步机制

cpuCode 2024-06-07 00:00:03
简介Redis 异步机制

影响 Redis 性能的潜在因素 :

  • Redis 内部的阻塞式操作
  • CPU 核和 NUMA 架构的影响
  • Redis 关键系统配置
  • Redis 内存碎片
  • Redis 缓冲区

阻塞点

Redis 交互点 :

  • 客户端 : 网络 IO,键值对增删改查操作,数据库操作
  • 磁盘 : 生成 RDB 快照,记录 AOF 日志,AOF 日志重写
  • 主从节点 : 主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数据库、加载 RDB 文件
  • 切片集群实例 : 向其他实例传输哈希槽信息,数据迁移

交互点/操作点 :

image.png

阻塞点:

  • 集合全量查询 , 聚合操作
  • bigkey 删除
  • 清空数据库
  • AOF 日志同步写
  • 从库加载 RDB 文件

客户端

客户端交互 :

  • Redis 用 IO 多路复用机制,避免主线程一直等待网络连接,所以,网络 IO 不会阻塞 Redis
  • 集合全量查询 (HGETALL , SMEMBERS) , 聚合操作 , 阻塞主线程
  • bigkey 删除 , 阻塞主线程

删除性能 :

  • 当数量从 10 万到 100 万时,删除时间的增长到了 20 倍
  • 集合元素越大,删除时间越长
  • Redis 的响应时间一般在微秒级别,当操作上 2s时,必然会阻塞主线程

image.png

磁盘

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 要返回数据,就必须要主线程执行

image.png

分析异步操作 :

  • 读操作 (集合全量查询 , 聚合查询) : 都是读操作 , 就必须要主线程执行
  • 删除操作 (bigkey 删除 , 清空数据库) : 不用返回数据 , 能异步执行
  • AOF 同步写 : 不用返回数据 , 能异步执行
  • 从库记载 RDB : 从库要对外服务 , 就必须要加载完毕 , 就必须要主线程执行

子线程

Redis 主线程启动后 , pthread_create 会创建 3 个子进程 :

  • AOF 写操作
  • 键值对删除
  • 文件关闭

异步子线程执行机制 :

  • 主线程通过链表的任务队列 , 与子线程交互。当收到删除键值对 , 清空数据库的操作时,主线程会把该操作封装成任务,并放入到任务队列中,并返回给客户端个完成信息
  • 惰性删除 (lazy free) : 子线程从任务队列中读取任务后,才实际删除键值对
  • AOF 配置 everysec : 子线程读取任务后,才写入 AOF

image.png

Redis 4.0 后提供异步删除键值对 , 清空数据库

  • UNLINK : 集合有大量元素删除 (如 : 百万级别或千万级别)
  • FLUSHDB ASYNC , FLUSHALL AYSNC : 异步清空数据库

Redis 4.0 前,进行 bigkey 删除

  • 用集合 SCAN 读取部分数据,再 DEL 删除。避免一次性删除大量 key 阻塞主线程
  • 集合全量 , 聚合查询 :用 SCAN ,分批读取数据,再在客户端进行聚合计算
  • 从库加载 RDB 文件:把主库的大小控制在 2~4GB 左右,保证 RDB 能较快加载
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。