Redis后台线程

单线程or多线程?

如果是算 IO 线程数,则:6.0以前是单线程,6.0以后默认还是单线程,但是可以通过io-threads配置成多线程。

如果是说Redis整个服务,则Redis是多线程,因为线程包括 IO线程 + 3个后台线程。

Redis 是单线程模型,一般是指:请求处理+周期任务。

1、处理请求。包括:包括接收连接、IO监听/读/写以及命令执行。

2、周期任务。如:删除过期key、字典 rehash 等。

后台线程

其实,还有一些非常耗时的操作,Redis 通过专用的线程来处理,这里的专用线程(后台线程)。

一个大型应用系统的正常运转需要协调多方资源,网络、磁盘、内存甚至还要处理客户端特性化的需求等等,每个模块都有各自的长短处,速度协调上往往会做出各种妥协。

Redis 这种纯内存操作,其瓶颈往往在于网络和内存,而不是 CPU。我们需要一些额外的线程来分担主线程的压力,在这些模块之间做一些适配 工作。

因此,单靠一个线程来处理所有事情,变成了一种奢求。Redis 中先后出现了一系列的后台线程,比如 close_file、aof_fsync 以及 lazy_free 都是为了解决这些问题。

这样的处理方式,让主线程专心处理 主营业务 (客户端请求),减少了其后顾之忧

后台线程触发机制

使用了典型的生产者-消费者模式,每一个后台线程都有其对应事件列表(队列),当有事件需要处理时,会发送到对应的后台线程队列,再唤醒后台线程(如果对应线程处于休眠状态),然后执行。

Redis 作为典型的事件型驱动框架,信息交流是以事件为媒介。

3个后台线程介绍

  • 通过 bio_close_file 线程来释放 AOF / RDB 等过程中产生的临时文件资源(文件关闭)

  • 通过 aof_fsync 线程将追加至 AOF 内存缓存中的数据写入磁盘

  • 通过 lazy_free 线程释放大对象(已删除)占用的内存空间