【Redis系列】- 有哪些情况会导致Redis阻塞

有哪些影响Redis性能的因素

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

  1. 客户端的阻塞

   Redis 使用了 IO 多路复用机制,能避免主线程一直处于等待状态,所以网络 IO不是导致 Redis 阻塞的因素而键值对的增删改查命令操作是主线程的主要工作。

       使用不当的命令:集合的全量查询和聚合操作

  • 比如keys * 获取所有的key。
  • Hgetall(用于返回哈希表中所有的字段和)。
  • smembers (命令返回集合中的所有的成员)。

      这些命令时间复杂度是O(n),有时候也就是要全表扫描,随着n的增大耗时也会越大。

 

  2. bigkey删除

  删除操作的本质是要释放键值对占用的内存空间,一下子释放了大量内存,在释放内存时,操作系统需要将释放掉的内存块插入一个空闲内存块的链表,以便后续管理和再分配。这个过程会阻塞当前释放内存的应用程序,也就会造成Redis主线程的阻塞。

  如果这个键值对数据很大,比如一个 zset集合里包含大量元素,就会释放大量的内存。有测试过删除 100 万个元素的集合时,删除时间会达到 2s,要知道 Redis 的响应是毫秒级别的。所以这种 bigkey 的删除也会成为Redis的阻塞点。


    3. 清空数据库

   清空数据库和上面bigkey删除也是同样道理,flushdb、flushall也涉及到删除和释放所有的键值对,也是 Redis 的阻塞点。


     4. AOF日志同步写

   AOF重写和RDB快照,Redis都用了子进程的方式操作,所以不会阻塞主线程。但Redis直接记录AOF日志,若有大量的写操作,并且配置的是同步写回的话,就会阻塞主线程了。一个同步写磁盘的操作的耗时大约1~2ms,如果有大量写操作需要记录到AOF日志并同步写回,就会阻塞主线程。


    5. 从库加载RDB文件

       在主从集群中,主库生成 RDB 文件,并传输给从库。主从复制过程的创建和传输 RDB都是子进程处理的,不会阻塞主线程。但是从库在接收了 RDB 文件后,需要使用 FLUSHDB 命令清空当前数据库,而且,在从库清空数据库后,需要将 RDB 文件加载到内存,快慢和 RDB文件大小相关。加载 RDB 文件又是一个阻塞点。RDB文件越大,阻塞就越久。

  切片集群会导致阻塞?

       切片集群的实例在负载均衡或者实例增加删除时,数据迁移是渐进式操作的,所以不会阻塞主线程

 

   

 

参考来源:https://mp.weixin.qq.com/s/c2N056PxAJahS7SDF3IVBA

posted @ 2022-12-20 17:06  songguojun  阅读(681)  评论(0编辑  收藏  举报