数据库(服务器)底层io的实现原理

Redis,Myspl,Memcached,nginx,Zeromq,Fastdfs,Haproxy,LeveIDB,Kafka。
上述这些数据库均可以看作一个服务器。

从客户端给服务器发的东西是什么?
拿Mysql来说,客户端往服务器发的就是sql语句。当客户端给Mysql服务器发送一个insert指令时,服务器通过读取这个网络io,读取出来相应的sql语句,再执行这个语句,使得服务器能够将这个数据插入到数据库里面。

底层io处理模型有哪些?
epoll+单线程/多线程/多进程

其中redis的实现就是使用的epoll+单线程
Memcached的实现是采用的epoll+多线程

Redis

是个单线程程序!这点必须铭记。

正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。这里需要注意的是,redis对外的网络请求服务是单线程的,但是其内部其他模块还是多线程的操作。

Redis 单线程为什么还能这么快?

因为它所有的数据都在内存中,所有的运算都是内存级别的运算,内存结构的特点决定了它的高性能特点。

Redis 单线程如何处理那么多的并发客户端连接?

那为什么能处理那么多的高并发客户端连接?(qps 可以达到5w,Mysql qps可以达到2000)Redis是单线程的,多个链接过去还是单线程处理,但Redis的瓶颈并不在处理上,而是网络传输,连接池多个连接并发发送过去的请求可以大大加快网络通信的效率,再加上Redis使用Linux底层多路I/O复用模型,才是Redis高吞吐量的精髓所在。
Redis会将每个客户端关联到两个队列,指令队列和响应队列。客户端的指令会通过指令队列来顺序处理,先到的客户端指令先处理。Redis服务器通过响应队列来将指令的返回结果给到客户端。

Memcached如何支持高并发

Memcached使用多路复用I/O模型(epoll,select等,具体为memcached采用的是libevent库,该库在linux下就是用的epoll)。传统阻塞I/O中,系统可能会因为某个用户连接还没做好I/O准备而一直等待,直到这个连接做好I/O准备(这时如果这时有其他用户连接到服务器,很可能因为系统阻塞而得不到响应)。多路复用I/O模型,阻塞不发生在具体执行I/O的,而是epoll或select上,当某个链接准备好IO时,epoll就返回这个连接的信息,进而去执行相应连接的IO,这样大大提升了CPU效率。此外memcached使用了多线程模式,在开启memcahed服务器时可以通过 -t指定线程数(线程数不是越多越好,一般指定为cpu核数就好了)。

你可能感兴趣的:(数据库(服务器)底层io的实现原理)