Redis 单线程

Redis 读写是否是单线程?

核心数据操作仍然是单线程

Redis 主要采用 单线程执行命令,这是因为:

  • 避免加锁:如果多个线程并发修改数据,就需要加锁,而 Redis 采用单线程保证操作的原子性,无需加锁,提高执行效率。
  • CPU 主要用于网络和内存操作,而非计算 :Redis 主要瓶颈在于 网络 I/O 和数据操作,而非 CPU 计算,所以单线程足够高效。
  • 避免上下文切换:单线程模型消除了多线程环境中的上下文切换开销,简化了代码逻辑,提高了性能。
  • 简化设计:单线程处理请求,避免了复杂的并发控制和锁机制,减少了潜在的竞争条件和死锁问题。
  • 数据一致性:由于只有一个线程在操作数据,确保了数据的一致性,避免了并发修改时可能出现的脏读和竞态条件。

👉 结论 :Redis 处理命令时(读写数据)仍然是单线程,所有指令在一个线程上按顺序执行,不会并行处理多个命令。

Redis 6.0+ 引入了多线程 I/O

虽然 Redis 本身是单线程处理命令,但 网络 I/O(包括请求解析和数据返回)可以多线程

  • 在 Redis 6.0 之前,网络 I/O 也是单线程,容易成为瓶颈。
  • 在 Redis 6.0+,网络 I/O 可以由 多个线程 处理,提高吞吐量,尤其是 大规模并发连接 时性能提升明显。

Redis 6.0+ 的并行模式

  • 多线程处理网络 I/O(请求解析、应答数据)。

  • 单线程执行具体命令(操作数据仍是单线程)。

  • 多线程默认关闭,但可以通过 io-threads 参数开启,例如:

    bash 复制代码
    redis.conf:
    io-threads 4  # 开启 4 个 I/O 线程

Redis 7.0+ 进一步优化

Redis 7.0 对 多线程 I/O 和内存分配 进一步优化,减少了线程间的锁竞争,使得性能进一步提升。

如何实现真正的多线程并行?

如果你的业务需要更高的吞吐量,可以采用 多实例+分片的方式,让多个 Redis 进程并行工作:

  1. Redis Cluster:使用多个 Redis 实例,每个实例单线程,但整体可以并行处理请求。
  2. 分片(Sharding)+ 多个 Redis 节点:让不同的 key 落到不同的 Redis 服务器,实现真正的多线程并行。
  3. 客户端并发:Redis 客户端(如 Redisson)可以用多个连接池,让多个请求同时访问 Redis。

总结

  • Redis 处理数据仍然是单线程,命令按顺序执行,避免加锁问题。
  • Redis 6.0+ 开始支持多线程网络 I/O,提升高并发吞吐量。
  • Redis 7.0 进一步优化多线程,减少锁竞争,提高效率。
  • 真正的并行 Redis 方案 :使用 Redis Cluster多个 Redis 实例 进行分片。

Redis Cluster 可以并行读写数据,具体并行度由 主节点的数量分片策略 决定。

Redis Cluster 如何实现并行读写

  1. 分片(Sharding)
    • Redis Cluster 会将数据按 哈希槽(hash slot) 分成 16384 个槽,数据根据键(key)通过哈希算法映射到不同的槽。
    • 每个主节点负责一定数量的槽,并且 Redis Cluster 将数据分布到多个主节点上,从而实现了 数据的分片存储
  2. 并行处理
    • 每个主节点独立处理自己的槽数据 ,因此 Redis Cluster 中的多个主节点可以并行处理不同槽的数据,提升了整体的并发能力。
    • 也就是说,当多个客户端请求不同的键时,它们可以被分发到不同的主节点进行并行读写,不会互相阻塞。

主节点的数量对并行读写的影响

  • 主节点数量越多,集群的并发能力越强。例如,若集群中有 10 个主节点,那么在没有任何网络瓶颈的情况下,最多可以并行处理 10 个请求。
  • 如果请求的数据分布合理(不同的请求命中不同的主节点),那么每个主节点会处理自己的请求,最大限度地提高集群的吞吐量。

从节点的作用

  • 从节点(Replica)并不能直接提升并行写能力,它们只用于读取和数据备份。
  • 如果一个主节点的读取压力过大,从节点可以帮助分担读取请求,但 写操作必须通过主节点 来执行。

数据分布与并行限制

  • 同一哈希槽的数据不能跨主节点存储 ,如果两个请求访问的数据属于同一哈希槽,那么这两个请求会被路由到相同的主节点。因此,即使集群中有多个主节点,如果两个请求都访问同一个槽的数据,它们的处理也是 串行的

总结

  • Redis Cluster 通过 分片和哈希槽机制 实现了并行读写数据。
  • 主节点数量 决定了集群的并发能力,主节点越多,集群的并行能力越强。
  • 读取请求 可以由从节点分担,但 写入操作只能由主节点处理
  • 数据访问的并行性取决于 请求命中的主节点,如果不同请求命中不同主节点,则可以并行执行。
相关推荐
hao_wujing15 分钟前
攻击模型的恶意行为检测
网络·数据库·php
秃头摸鱼侠1 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck1 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机1 小时前
6. MySQL基本查询
数据库·mysql
�FENG2 小时前
Redis 安装配置和性能优化
redis·持久化
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩2 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang2 小时前
负载均衡LB》》HAproxy
运维·数据库·负载均衡