📝个人主页:五敷有你
🔥系列专栏:面经
⛺️稳中求进,晒太阳
Redis为什么快呢?
- 它是C语言编写,速度快。
- 它是基于内存速度快。
- 他是单线程,减少了上下文的切换。
- 它是非阻塞IO多路复用。
- 具有高级数据结构(如 SDS、Hash以及跳表等)
那非阻塞IO是什么
通过该系统调用可以监视多个文件描述符。一旦某个描述符就绪(一般是内核缓冲区可读可写),内核就能将就绪的状态返回给应用程序。随后,应用程序根据就绪状态进行相应IO。
在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作
O多路复用模型如下图所示:
那select和epoll有什么区别
select是一个函数,它支持最大的连接数是1024或2048,因为select函数需要传入fd_set参数,fd_set就是一个bitmap,数据没到缓冲区就是0,到了为1。 select函数会不断遍历set中的bit标识位,当有标识位发生变化,就发起中断处理。
epoll是为了解决select的缺点,它定义了epoll_event结构体来解决,解决了select存在最大连接数的限制,epoll不会遍历所有的文件描述符(fd),epoll会将准备就绪的文件描述符维护在一块指定的空间内,每次从中取出已经准备就绪的文件描述符处理,大大提高性能。