IT评测·应用市场-qidao123.com技术社区

标题: Redis毕竟为什么这么快? [打印本页]

作者: 西河刘卡车医    时间: 2024-11-25 10:27
标题: Redis毕竟为什么这么快?
Redis为什么这么快?

Redis 基于 Reactor 模式开发了本身的网络变乱处置惩罚器,这个处置惩罚器被称为文件变乱处置惩罚器 file event handler。由于这个文件变乱处置惩罚器是单线程的,所以Redis才叫做单线程的模子,但是它采用IO多路复用机制同时监听多个Socket,并根据Socket上的变乱来选择对应的变乱处置惩罚器进行处置惩罚。文件变乱处置惩罚器的布局包含4个部分,线程模子如下图:

多个 Socket 可能会产生差别的操纵,每个操纵对应差别的文件变乱,但是IO多路复用程序会监听多个Socket,将Socket产生的变乱放入队列中列队,变乱分派器每次从队列中取出一个变乱,把该变乱交给对应的变乱处置惩罚器进行处置惩罚。
Redis客户端对服务端的每次调用都经历了发送死令,执行下令,返回效果三个过程。其中执行下令阶段,由于Redis是单线程来处置惩罚下令的,所有每一条到达服务端的下令不会立即执行,所有的下令都会进入一个队列中,然后逐个被执行。而且多个客户端发送的下令的执行顺序是不确定的。但是可以确定的是不会有两条下令被同时执行,不会产生并发题目,这就是Redis的单线程基本模子。
多路I/O复用模子是使用 select、poll、epoll 可以同时监察多个流的 I/O 变乱的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 变乱时,就从阻塞态中唤醒,然后程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了变乱的流),而且依次顺序的处置惩罚就绪的流,这种做法就避免了大量的无用操纵。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处置惩罚多个客户端的网络IO连接请求(尽量减少网络 IO 的时间消耗)
为什么Redis是单线程?

这里我们强调的单线程,指的是网络请求模块使用一个线程来处置惩罚,即一个线程处置惩罚所有网络请求,其他模块仍用了多个线程。
那为什么使用单线程呢?官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
但是,我们使用单线程的方式是无法发挥多核CPU 性能,不过我们可以通过在单机开多个Redis 实例来解决这个题目
Redis6.0 的多线程

1、Redis6.0 之前为什么一直不使用多线程?
Redis使用单线程的可维护性高。多线程模子虽然在某些方面表现优秀,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列题目,增加了系统复杂度、同时可能存在线程切换、乃至加锁解锁、死锁造成的性能消耗。
2、Redis6.0 为什么要引入多线程呢?
因为Redis的瓶颈不在内存,而是在网络I/O模块带来CPU的耗时,所以Redis6.0的多线程是用来处置惩罚网络I/O这部分,充分使用CPU资源,减少网络I/O阻塞带来的性能消耗。
多线程模式下,是否存在线程并发安全题目?

如图,一次redis请求,要建立连接,然后获取操纵的下令,然后执行下令,最后将响应的效果写到socket上。

在redis的多线程模式下,获取、解析下令,以及输出效果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是下令的执行,也就是内存操纵,依然是单线程运行的。所以,Redis 的多线程部分只是用来处置惩罚网络数据的读写和协议解析,执行下令仍旧是单线程顺序执行,也就不存在并发安全题目。
口试题专栏

Java口试题专栏已上线,欢迎访问。
那么可以私信我,我会尽我所能帮助你。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4