Redis - 面试题

Redis 6.0 之前,为什么使用单线程,使用单线程为什么还很快?

我们说的 Redis 单线程实际是指具体执行操作命令时是单线程,Redis 实际会有一些后台线程来处理其他任务,例如 AOF 刷盘、后台释放内存等

1
2
Redis 2.6 版本,会启动两个后台线程,分别处理关闭文件、AOF 刷盘
Redis 4.0 版本之后,新增一个后台线程,用于异步释放内存。例如执行 unlink、flushdb async、flushall async 等命令,会把这些删除操作交给后台线程执行
  • 由于 Redis 的操作大部分在内存中完成,并且数据结构足够高效,因此 Redis 的瓶颈更可能是内存或带宽,而不是 CPU。因此单线程足够使用
  • 单线程模型可以避免多线程竞争,省去线程切换的损耗,也不会导致死锁
  • Redis 采用 I/O 多路复用来处理大量客户端请求。该机制允许内核中同时存在多个监听 Socket 和已连接 Socket。内核会一直监听 Socket 上的请求,一旦有请求到达就会交给 Redis 线程处理

Redis 6.0 之后为什么引入了多线程?

实际是在网络 IO 部分引入了多线程,具体的命令执行还是单线程

这是由于随着网络硬件的提升,Redis 的瓶颈有时会出现在对网络 IO 的处理上,因此为了提高网络 IO 的并行度,Redis 6.0 对于网络 IO 采用多线程来处理

默认情况下,IO 多线程只针对发送响应数据,并不会以多线程的方式处理了读请求(可以通过配置文件开启)

Licensed under CC BY-NC-SA 4.0
最后更新于 Nov 12, 2020 00:00 UTC