赞
踩
目录
这个是由Redis的实现机制决定的,Redis网络事件处理器是基于文件事件处理器实现的,这个文件事件处理器是单线程的,所以决定了Redis是以单线程运行。
它采用IO多路复用机制同时监听多规格socket(套接字),将产生事件的socket压入内存队列中,事件分派器根据socket上的事件类型来选择对应的事件处理器进行处理。
Redis启动时,会初始化文件事件处理器,包括创建事件循环实例和注册socket。
Redis为每个客户端连接分配一个套接字,并将该套接字注册到事件循环中。
当被监听的套接字准备备好执行连接应答(accept),读取(read),写入(write),关闭(close)等操作时,与操作相对应的文件事件就会产生。
一旦有事件触发,事件循环将返回一个已就绪文件描述符列表(socket),事件分派器调用事件处理器依次处理好每个socket。
文件事件处理器是单线程模式运行的,但是通过IO多路复用机制监听多个socket,并根据socket目前执行的任务来为套接字关联不同的事件处理器。可以实现高性能的网络通信模型。又可以跟内部其他单线程的模块进行对接,保证了Redis内部的线程模型的简单性。
当Redis初始化时,程序会将连接应答处理器与服务端监听套接字的AE_READABLE事件关联起来,当有客户端通过socket连接服务端时,套接字就会产生AE_READABLE事件,引发连接应答处理器执行,并执行相应的套接字应答操作。
当一个客户端第一步通过socket与服务端连接成功后,服务端将会把该socket的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务端发起命令请求时,如get ,set,套接字会产生AE_READABLE事件,关联的命令请求处理器就会被执行
当服务端需要给客户端相应时,服务端会将客户端套接字的AE_WRITEABLE和命令回复处理器关联,当客户端准备好接受响应数据时,就会触发AE_WRITEABLE事件,执行关联的命令回复处理器的程序,执行对应套接字写入操作,当数据写入完毕,就会将客户端套接字的AE_WRITEABLE事件和命令回复处理器解绑,但是客户端套接字的AE_READABLE事件还是会和命令请求处理器关联。
虽然Redis基于内存操作,速度非常快,但是随着硬件的提升,Redis的性能瓶颈可能出现网络IO的读写,也就是:单个线程处理网络读写的速度跟不上底层网络硬件的速度;并且越来越复杂的业务场景,也需要更大的QPS。
网络的读写指的是通过网络进行的数据读取和写入操作。
从Redis自身角度来说,因为读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的IO消耗,优化只要有两个方向:
所以总结起来,redis支持多线程主要就是两个原因:
Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制key,事务等并发问题。
Redis 采⽤多个 IO 线程来处理⽹络请求,提⾼⽹络请求处理的并⾏度。Redis 多 IO 线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。这是因为:
Redis的瓶颈不在CPU,而在内存和网络IO。内存不够的话,可以加内存或者做数据结构优化等,但是网络IO的性能优化才是大头,网络IO的读写在Redis整个执行期间占用了大部分的时间,如果把网络处理这部分做成多线程处理方式,那对整个Redis的性能会有很大的提升
安全。多线程只是用在了IO读写和协议解析上面。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。