Redis(十四):性能问题

本文探讨了Redis性能问题,包括阻塞操作、CPU核影响、关键系统配置等方面。重点关注客户端交互、磁盘交互、主从节点交互和切片集群实例交互中的阻塞点,以及内存碎片、缓冲区管理和异步子线程机制对性能的影响。建议关注自动删除过期key、文件系统和操作系统设置以优化Redis性能。
摘要由CSDN通过智能技术生成

前言

上一篇介绍了 Redis 作为缓存服务器的问题。这节开始介绍 Redis 性能方面的问题。Redis 的性能主要会受以下几方面的影响。

阻塞式操作

客户端交互时的阻塞点
  1. 复杂度高的增删改查操作(复杂度达到 O(N) 及以上的操作)。
  2. 删除数据。删除操作的本质是要释放键值对占用的内存空间。为了更加高效地管理内存空间,在应用程序释放内存时,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。这个过程本身需要一定时间,而且会阻塞当前释放内存的应用程序,所以,如果一下子释放了大量内存,空闲内存块链表操作时间就会增加,相应地就会造成 Redis 主线程的阻塞。
  3. 清空数据库,相当于删除和释放所有的键值对。

由于使用了 IO 多路复用机制,避免了主线程一直处于等待网络连接或请求到来的状态,所以网络 IO 不是导致 Redis 阻塞的因素。但是如果网络 IO 过多,也会影响 Redis 的性能。

磁盘交互时的阻塞点

Redis 采用子进程的方式生成 RDB 快照文件和执行 AOF 日志重写操作,但是将 AOF 重写缓冲区中的数据追加到从服务器时,仍然会阻塞主进程。

主从节点交互时的阻塞点

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

但是,对于从库来说,它在接收了 RDB 文件后,需要使用 FLUSHDB 命令清空当前数据库,会阻塞从库(如果数据量大,需要较长的时间)。

此外,从库在清空当前数据库后,还需要把 RDB 文件加载到内存,这个过程的快慢和 RDB 文件的大小密切相关,RDB 文件越大,加载过程越慢。

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

当我们部署 Redis 切片集群时,每个 Redis 实例上分配的哈希槽信息需要在不同实例间进行传递,同时,当需要进行负载均衡或者有实例增删时,数据会在不同的实例间进行迁移。

如果你使用了 Redis Cluster 方案,而且同时正好迁移的是 bigkey 的话,就会造成主线程的阻塞,因为 Redis Cluster 使用了同步迁移。

异步子线程机制

Redis 主线程启动后,会使用操作系统提供的 pthread_create 函数创建 3 个子线程,分别由它们负责 AOF 日志写操作、键值对删除以及文件关闭的异步执行

主线程通过一个链表形式的任务队列和子线程进行交互。当收到操作命令时,主线程会把这个操作封装成一个任务,放入任务队列中,然后给客户端返回一个完成信息,表明任务已经完成。但实际上,这操作还没有执行,等到后台子线程从任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值