数据库(服务器)底层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核数就好了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值