目录
Redis 作为高性能的键值对存储系统,在实际项目中得到了广泛的应用。但是在使用中我们必须重视有可能影响 Redis 性能的各种因素,本篇文章就带你了解可能会引起 Redis 阻塞的各种因素及解决方案。
一、Redis 有哪些阻塞点
Redis 在实际运行中,要和许多对象进行交互,这些不同的交互会涉及不同的操作,下面是 Redis 实例交互的对象,以及交互过程中会发生什么操作。
- 客户端:为客户端提供服务是最重要的功能,Redis 与客户端之间存在网络 I/O,通过网络 I/O 来实现数据的增删改查操作;
- 磁盘:Redis 在运行过程中要保证数据的可靠性,就需要将内存中的数据持久化到磁盘。因此,Redis 会记录 AOF 日志、AOF 日志重写,以及 RDB 快照生成;
- 主从节点:为了防止 Redis 实例挂掉后无法提供服务,通常会有若干个从节点进行数据冗余,以保证可用性。在同步的过程中,主库会生成、传输 RDB 文件,从库会接受到 RDB 文件,清空数据库,加载 RDB 文件等操作;
- 切片集群:为了保存大量的数据,对 Redis 进行切分,每个切片上保存一部分数据,这样就可以保存大量的数据。这个过程中会涉及向其他实例传输哈希槽信息以及数据迁移等。
下面来分析一下这些操作中哪些可能会引起阻塞。
二、客户端交互
2.1 网络I/O
网络 I/O 有时会成为性能瓶颈,但 Redis 使用了 I/O 多路复用机制,避免了主线程一直处于网络连接或等待状态,所以在 Redis 中,网络 I/O 不是做成阻塞的因素。
2.2 键值对操作
键值对的增删改查是 Redis 和客户端交互的主要部分,也是 Redis 主线程的主要任务。所以复杂度高的增删改查操作肯定会阻塞主线程,进而阻塞 Redis。
判断操作复杂度的高低有一个基本的标准,就是看操作的复杂度是否为O(N),Redis 中涉及到集合操作时,操作的复杂度为 O(N),例如集合元素的全量查询 HGETALL、SMEMBERS,以及集合的聚合统计,如求交集、并集。
关于操作命令的复杂度,Redis 官方提供了复杂度查询方式:Commands | Docs
所以 Redis 的第一个阻塞点为:集合的全量查询和聚合操作。
<