Redis 之所以被广泛的使用,其原因就是 Redis 能够支持高性能的访问,但是对于使用单线程模型的 Redis 而言,造成 Redis 被阻塞有五大方面的潜在因素。
一、Redis 内部的阻塞操作
Redis 在运行之后就需要和多个实例之间进行交互,这些交互的过程涉及到的不同的操作就会阻塞 Redis,其中有四个主要方面的交互:客户端交互,主从库交互,磁盘交互和切片集群交互。
- 客户端交互:网络IO,键值对的增删改查,数据库的操作
- 磁盘交互:生成 RDB 文件,生成 AOF 日志文件,AOF 日志的重写
- 主从节点交互:主库的重选,传输 RDB 文件,接收 RDB 文件,清空数据库,加载 RDB 文件。
- 切片集群交互:各个 Redis 实例之间哈希槽信息的传输,以及数据迁移。
(1)与客户端交互中的阻塞点
- 网络 IO 有时候会比较的慢,但是 Redis 使用了多路复用机制,解决了 Redis 阻塞在等待网络的连接及其等待客户发送请求等的过程中,因此网络 IO 不是造成 Redis 被阻塞的原因。
- 客户端发送的键值对请求操作是由 Redis 主线程负责执行的,因此对于一些时间复杂度比较高的操作就肯定会造成阻塞主线程。而哪些是时间复杂度比较高的操作?
- 集合的全量查询及其聚合操作
- 这些操作通常时间复杂度就是 O(n),对于读写性能高的 Redis 而言这个是第一个阻塞点。
- bigkey 的删除操作
- big
- 集合的全量查询及其聚合操作