16 | 异步机制:如何避免单线程模型的阻塞?

114 阅读3分钟

基本概念

  • redis影响性能因素

    • Redis 内部的阻塞式操作\

    • CPU 核和 NUMA 架构的影响\

    • Redis 关键系统配置\

    • Redis 内存碎片\

    • Redis 缓冲区

Redis 实例有哪些阻塞点?

  • redis操作交互

    • 客户端:

      • 网络 IO
      • 键值对增删改查操作
      • 数据库操作\
    • 磁盘

      • 生成RDB快照
      • 记录AOF操作日志
      • AOF操作日志重写\
    • 主从节点

      • 主库生成\

      • 传输 RDB 文件\

      • 从库接收 RDB 文件\

      • 清空数据库\

      • 加载 RDB 文件

    • 切片集群实例\

      • 数据迁移\

    1. 和客户端交互时的阻塞点\

    • 网络io慢  使用IO多路复用

    • 增删改查操作  如果复杂度高的增删改查肯定会阻塞Redis\

      • 阻塞点1:对集合的全量查询 例如查询操作 HGETALL、SMEMBERS

      • 阻塞点1: 集合的聚合统计操作

      • 删除操作  

        • 需要释放占用的内存空间

        • 操作系统需要把释放掉的内存块插入一个空闲内存块的链表\

        • 会阻塞当前释放内存的应用程序\

        • 阻塞点2: bigkey 删除会导致主线程阻塞

        • **阻塞点3: 清空数据库
          **

    1. 和磁盘交互时的阻塞点\

    • 子进程的方式生成 RDB 快照文件\

    • 子进程执行 AOF 日志重写操作\

    • 阻塞点4: AOF 日志同步写\

    1. 主从节点交互时的阻塞点\

    • 主库在复制的过程中,创建和传输 RDB 文件都是由子进程来完成的,不会阻塞主线程\

    • 但是从库会执行FLUSHDB,阻塞点3

    • 加载大RDB是阻塞点5

    1. 切片集群实例交互时的阻塞点\

    • 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 文件能以较快的速度加载\

\