当前位置: 首页 > web >正文

Redis是单线程的,如何提高多核CPU的利用率?

一句话回答:

Redis 是单线程处理客户端命令,但可以通过 多实例部署、I/O 多路复用、后台线程 + Redis 6 的 I/O Thread 支持,来充分利用多核 CPU。

 

一、Redis 单线程 ≠ 整个 Redis 都是单线程!

Redis 主要的 网络事件 + 命令执行 是单线程的(主线程),但它其实有多线程参与的场景👇

模块多线程吗?说明
✅ 网络 I/O 处理(Redis 6 起)✅ 可启用 I/O 线程并发读写
❌ 命令执行(SET/GET)❌ 仍是主线程执行
✅ 持久化(RDB/AOF写盘)✅ 后台子进程执行
✅ 异步删除 / 释放内存✅ lazyfree 用线程池处理
❌ Key 锁 / 数据结构操作❌ 主线程,避免加锁开销

二、Redis 利用多核的方式有哪些?

1. 启用 Redis 6+ 的 I/O 多线程

Redis 6 开始支持 I/O 多线程(仅限网络读写,命令仍在主线程):

# redis.conf 中配置io-threads 4io-threads-do-reads yes
  • 原理:接收多个客户端的请求数据,可并行读取 socket → 提高吞吐量

  • 适合场景:客户端很多、网络收发慢(不是 CPU 密集型命令)

2. 多 Redis 实例部署(横向扩展)

  • 在一台服务器上跑多个 Redis 实例(每个实例单线程)

  • 不同实例绑定不同 CPU 核心(taskset

  • 适合多核机器,配合客户端做 分库分槽 分流访问

💡 适合写多、热点分散的业务,比如电商、用户数据分库等

Redis分片

Redis 分片(Sharding)是把全量数据按一定规则(如 key 的 hash 值)分配到多个 Redis 实例中,每个实例负责一部分 key。

为什么分片能提升多核利用率?
特性说明
每个 Redis 实例是单线程所以单实例最多利用 1 核 CPU ✅
多实例部署可以跑在多个 CPU 核心上 ✅
客户端路由

每次只访问一个实例,减轻单点压力 ✅

3. 使用 Redis Cluster(集群)

  • 多 Redis 实例组成分布式集群,每个节点负责部分 key

  • 多节点 = 多核多机并发,天然并行处理

💡 适合大规模分布式部署,自动分片 + 故障转移

4. 后台任务异步多线程(系统内建)

Redis 内部本身就会用多线程处理一些后台任务,例如:

操作说明
异步删除大 keyUNLINKFLUSHDB ASYNC 用线程释放内存
RDB 保存 / AOF rewrite用子进程执行,避免阻塞主线程
key 过期处理一部分定时触发,一部分惰性删除(在主线程)

三、Redis 单线程的好处

你可能会问:为啥不多线程执行命令呢?

因为 Redis 的核心数据结构很复杂(如 ziplist、skiplist、hashtable),加锁会带来:

  • ❌ 上下文切换成本

  • ❌ 锁竞争

  • ❌ 不可预测的并发 Bug

👉 单线程让它保持 高性能 + 数据一致性 + 代码极简

 

http://www.xdnf.cn/news/2001.html

相关文章:

  • 大学IP广播系统解决方案:构建数字化智慧化大学校园IP广播平台
  • 【含文档+PPT+源码】基于微信小程序的校园快递平台
  • HTML 模板技术与服务端渲染
  • 京东平台关键字搜索接口开发指南:Python实现与代码详解
  • PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
  • 大模型扫盲之推理性能指标全面详解
  • linux系统问题杂谈
  • Framework模块编译脚本利器
  • KafkaSpark-Streaming
  • C语言数据类型全面解析:从入门到精通
  • Django【应用 01】django-plotly-dash安装及使用
  • Java 设计模式心法之第22篇 - 备忘录 (Memento) - 捕获与恢复对象状态的“时光机”
  • 力扣-160.相交链表
  • 制作一款打飞机游戏23:编辑器ui
  • kafka与flume的整合、spark-streaming
  • Virtio 技术解析 | 框架、设备实现与实践指南
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】一、Zookeeper 快速入门和核心概念
  • EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验
  • Golang日志模块之xlog
  • 58、微服务保姆教程(一)
  • classfinal 修改过源码,支持jdk17 + spring boot 3.2.8
  • BGE-m3 和 BCE-Embedding 模型对比分析
  • 深度强化学习(DRL)实战:从AlphaGo到自动驾驶
  • 三串口进行试验
  • Golang | 倒排索引
  • 前端技术Ajax实战
  • 机器学习基础理论 - 判别模型 vs 生成模型
  • Kafka和其他组件的整合
  • 从零开始学习人工智能Day5-Python3 模块
  • 25%甘油(灭菌)保存菌液以及10%甘油(普通)保存蛋白的原理及操作-实验操作系列-010