一架梯子,一头程序猿,仰望星空!
Redis面试题 > 内容正文

Redis是单线程还是多线程?为什么?


问题简答

Redis6.0以前的版本,从处理Redis数据读写角度看,确实单线程模型,Redis只是使用一个线程负责读写内存数据;但是从Redis整体看,Redis是多线程的,除了前面提到的有一个线程专门处理Redis的请求,Redis还会启动多个线程处理不同的任务。

问题详解:

Redis“单线程模型”

Redis采用单线程模型,即主线程用于接收客户端连接、接收客户端的请求和执行命令,以及和客户端进行数据交互,同时维护着一个事件循环(Event Loop),将IO事件交给底层的IO多路复用程序来处理。

Redis为什么单线程性能这么强

1.避免线程上下文切换的开销

线程上下文切换开销是非常昂贵的,当线程数量较多时,线程切换会大大降低 Redis 的性能。单线程避免了这个问题,使 Redis 更加高效。

2.避免竞态条件的发生

Redis 的内存数据结构非常简单,单线程避免了多线程并发访问时可能导致的竞态条件的发生,避免了复杂的线程同步问题。

3.使用多路复用技术

Redis 使用 I/O 多路复用技术,使得单线程可以处理大量的连接,进一步提升了 Redis 的性能。

4.Redis瓶颈不在CPU上

Redis作为内存数据库,内存读写速度本身就很快,瓶颈主要集中在网络IO、内存大小上面。

为什么也可以说Redis是多线程的?

虽然 Redis 主线程是单线程的,但是 Redis 实际上会启动多个线程,包括主线程和若干个后台线程。这些后台线程主要用于网络 I/O、异步磁盘操作等,以提升 Redis 的并发性和可靠性。

其中,后台线程主要包括以下几种:

  • 定时器线程:用于处理过期键和延时任务。
  • RDB 和 AOF 线程:用于执行 RDB 和 AOF 操作,以及异步地将数据写入磁盘。
  • 数据删除线程:用于在内存使用达到最大限制时,根据一定的策略删除一些键值对以释放内存。