1、什么是redis的单线程模型?

redis基于Reactor模式开发了自己的一套事件处理机制,即redis中的文件事件处理器(file event handler)。由于文件事件处理器是单线程运行的,因此说redis是单线程模型。

Reactor网络编程模型、Reactor模式
事件驱动模型为什么基于事件驱动的服务器能实现高并发?
Reactor事件处理机制为:主程序将事件以及对应事件处理的方法在Reactor上进行注册, 如果相应的事件发生,Reactor将会主动调用事件注册的接口,即 回调函数.
在这里插入图片描述
Reactor事件处理机制的编程模型,在Redis中也得到了很好的运用。Redis中基于I/O多路复用(mutiplexing) 开发Reactor事件处理机制,监听多个套接字的AE_READABLE读,AE_WRITABLE写事件。读事件绑定读操作和具体执行命令的操作函数,写事件绑定命令回复的操作函数。

2、redis作为单线程模型,怎么监听大量的客户端连接?

redis通过io多路复用程序来监听多个socket(客户端连接),然后根据socket需要执行的操作(连接应答(accept)、读取(read)、写入(write)、关 闭(close)等)产生事件,再根据事件类型为每个socket绑定事件处理器,然后文件事件处理器调用绑定好的事件处理器来处理事件。
多路指的是多个socket连接,复用指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。
io多路复用程序相比多线程的优点:无需额外创建多余的线程监听客户端大量的连接,节省资源。
在这里插入图片描述
总之:redis通过单线程的文件事件处理器与多路io复用程序 处理大量客户端连接产生的事件,实现高性能的网络通信。

3、为什么redis在最初的版本(4.0之前)选择单线程模型,而不是多线程?

1 性能瓶颈不在于cpu资源:
多线程的目的是为了充分利用cpu的利用率并发执行不同的任务,而redis的性能瓶颈往往不在于cpu资源,即便是在普通的linux服务器上启动redis服务,也可以轻松达到10w+的qps。
redis的性能瓶颈在于网络和内存;
2 可维护性高
单线程的代码是串行执行的,便于开发和测试。
多线程程序的执行顺序是不确定的,引入多线程必须要引入并发控制,例如为共享数据加上互斥锁。
3 多线程会存在死锁、线程上下文切换等问题,甚至会影响性能:
使用io多路复用机制同样可以实现对于大量socket连接(文件描述符)的监听,并且无需额外创建线程去监听大量socket连接,节约资源。

4、为什么redis在4.0之后的版本中加入多线程支持?

使用后台线程处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、超大键值对的删除。
例如 加入了可以进行多线程异步处理的删除操作(非阻塞删除操作),用来删除数据库中的超大键值对。
因为,redis主线程调用事件处理器删除超大键值对时,会阻塞待处理的任务,影响处理请求的性能。
而释放内存空间的操作可以利用后台线程进行异步处理。例如UNLINK指令,只会将键从元数据中删除,值的删除操作会在后台异步执行。

5、redis6之后为何引入多线程?

为了提高网络数据的读写性能,网络数据的读写是redis的瓶颈之一。多线程可以分摊io读写负荷。
redis6仅在网络数据读写操作上使用了多线程,其文件事件处理器程序仍然是单线程,因此,无需担心线程安全问题。
redis的多线程并不是默认开启的,需要在conf中开启,并设置线程数。

Redis 6.0 新特性-多线程连环13问

6、阐述一下Redis6.0多线程的实现机制?

IO线程只负责 读socket并解析请求、写socket,不负责命令的处理;IO线程要么在读,要么在写,不会同时读或写。
流程简述:
主线程接收建立连接请求,获取socket,并放入全局等待读队列
等待队列满,将等待读队列平均分配给IO线程(多线程),进行socket与线程的绑定;
主线程阻塞,等待IO线程(多线程)读socket并解析请求;
主线程(单线程)执行所有请求命令,并将执行结果数据存入缓冲区;
主线程阻塞,等待IO线程(多线程)回写socket;
socket回写完毕,接触绑定,清空等待队列。
在这里插入图片描述
注:IO多线程只用来处理socket读写,执行命令仍然是单线程顺序执行,因此无需考虑命令请求处理的线程安全问题

7、Redis6.0采用多线程后,性能的提升效果如何,适用于什么场景?

Redis 作者 antirez 在 RedisConf 2019分享时曾提到:Redis 6 引入的多线程 IO 特性对性能提升至少是一倍以上。
场景:待

参考:javaguide

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐