讲Redis是单线程还是多线程的需要根据redis各版本的一个变化,在Redis的老版本中,redis是单线程的,redis的数据处理读写命令都是由一个线程完成,并且速度很快,是因为redis的数据都是存储在内存中的,避免了磁盘I/O的瓶颈,有通过非阻塞IO和事件驱动模型,使得单线程依旧可以处理大量的数据并发和请求。
明确几点:
1. 在任何版本中,redis的数据命令读写处理,例如:GTE和SET等,还是单个主线程执行的,这样确保了原子性和一致性,
2. redis的数据是存在内存中的,单线程已经可以非常高效的处理大量的并发操作。
2. 单线程意味着在任何时候,reids只有一个操作在执行。
后续随着时代的发展,对性能的要求也越来越高,单线程的redis的某些功能在一些场景下出现性能瓶颈,开始引入了多线程的概念。下面看各版本Redis的变化。
Redis的4.0版本
在这个版本redis引入了模块系统,但是核心的服务器并没有使用多线程来处理客户端的请求和命令,所有的操作和命令执行还是由主线程进行操作的。模块系统可以让开发人员取扩展Redis的功能和模块,这些扩展的功能和模块可以使用自己的多线程。
Redis的5.0版本
在这个版本Redis引入了新的数据类型,流数据类型(stream data type),这个不在多说。
Redis的6.0版本
就是在6.0版本,redis开始引入了多线程I/O,这是一个重大的升级,之前的版本虽然在很高效,但是在网络I/O操作一直是单线程负责,这在大规模并发场景下可能会成为性能瓶颈,所以引入了多线程来处理客户端请求的的网路读写操作,在不影响Redis执行命令的一致和原子性情况下,提高了并发处理能力。
Redis是使用IO多路复用技术来同时处理多个客户端连接的网络请求的,可以看这篇文章讲的就是Redis的IO多路复用:Redis的IO多路复用-CSDN博客
假设我们有一个高流量的游戏服务器,使用 Redis 6.0 维护玩家的实时状态和会话信息。在非常繁忙的时间,数以万计的玩家可能会同时在线,并频繁地读写数据到 Redis。在单线程I/O模型中,即使 Redis 能够快速处理每一个操作,单个线程依然可能成为处理所有网络数据的瓶颈。启用多线程 I/O 后,读写操作可以在多个线程间分摊,减轻主线程的压力,并提高总体吞吐量。
如果游戏服务器有 16 个 CPU 核心,我们可能会在 redis.conf 配置文件中,将 io-threads
设置为 4 或 8,以有效分配资源并避免上下文切换开销太大:
io-threads 4
io-threads-do-reads yes
启用了多线程 I/O 的 Redis 6.0 服务器将能更好地处理游戏过程中的大量并发网络请求,特别是在玩家数量激增的情况下。