Redis线程IO模型-Redis 单线程为什么还能这么快?
2021/4/18 2:27:58
本文主要是介绍Redis线程IO模型-Redis 单线程为什么还能这么快?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Redis线程IO模型:
我们都知道Redis是单线程的程序,除了 Redis 之外,Node.js 也是单线
程,Nginx 也是单线程,但是它们都是服务器高性能的典范。
Redis 单线程为什么还能这么快?
因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线
程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使
用,一不小心就可能会导致 Redis 卡顿。
非阻塞 IO
当我们调用套接字的读写方法,默认它们是阻塞的,比如 read 方法要传递进去一个参数
n,表示读取这么多字节后再返回,如果没有读够线程就会卡在那里,直到新的数据到来或者连接关闭了,read 方法才可以返回,线程才能继续处理。而 write 方法一般来说不会阻塞,除非内核为套接字分配的写缓冲区已经满了,write 方法就会阻塞,直到缓存区中有空闲空间挪出来了。
非阻塞 IO 在套接字对象上提供了一个选项 Non_Blocking,当这个选项打开时,读写方
法不会阻塞,而是能读多少读多少,能写多少写多少。能读多少取决于内核为套接字分配的
读缓冲区内部的数据字节数,能写多少取决于内核为套接字分配的写缓冲区的空闲空间字节
数。读方法和写方法都会通过返回值来告知程序实际读写了多少字节。
有了非阻塞 IO 意味着线程在读写 IO 时可以不必再阻塞了,读写可以瞬间完成然后线
程可以继续干别的事了。
事件轮询 (多路复用)
非阻塞 IO 有个问题,那就是线程要读数据,结果读了一部分就返回了,线程如何知道
何时才应该继续读。也就是当数据到来时,线程如何得到通知。写也是一样,如果缓冲区满
了,写不完,剩下的数据何时才应该继续写,线程也应该得到通知。
事件轮询 API 就是用来解决这个问题的,最简单的事件轮询 API 是 select 函数,它是操作系统提供给用户程序的 API。输入是读写描述符列表 read_fds & write_fds,输出是与之对应的可读可写事件。同时还提供了一个 timeout 参数,如果没有任何事件到来,那么就最多等待 timeout 时间,线程处于阻塞状态。一旦期间有任何事件到来,就可以立即返回。时间过了之后还是没有任何事件到来,也会立即返回。拿到事件后,线程就可以继续挨个处理相应的事件。处理完了继续过来轮询。于是线程就进入了一个死循环,我们把这个死循环称为事件循环,一个循环为一个周期。
每个客户端套接字 socket 都有对应的读写文件描述符。
read_events, write_events = select(read_fds, write_fds, timeout) for event in read_events: handle_read(event.fd) for event in write_events: handle_write(event.fd) handle_others() # 处理其它事情,如定时任务等
因为我们通过 select 系统调用同时处理多个通道描述符的读写事件,因此我们将这类系
统调用称为多路复用 API。现代操作系统的多路复用 API 已经不再使用 select 系统调用,而
改用 epoll(linux)和 kqueue(freebsd & macosx),因为 select 系统调用的性能在描述符特别多时
性能会非常差。它们使用起来可能在形式上略有差异,但是本质上都是差不多的,都可以使
用上面的伪代码逻辑进行理解。
服务器套接字 serversocket 对象的读操作是指调用 accept 接受客户端新连接。何时有新连
接到来,也是通过 select 系统调用的读事件来得到通知的。
事件轮询 API 就是 Java 语言里面的 NIO 技术Java 的 NIO 并不是 Java 特有的技术,其它计算机语言都有这个技术,只不过换了一个词汇,不叫 NIO 而已。
这篇关于Redis线程IO模型-Redis 单线程为什么还能这么快?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-18Redis安装入门:新手必读指南
- 2024-11-08阿里云Redis项目实战入门教程
- 2024-11-08阿里云Redis资料:新手入门与初级使用指南
- 2024-11-08阿里云Redis教程:新手入门及实用指南
- 2024-11-07阿里云Redis学习入门:新手必读指南
- 2024-11-07阿里云Redis学习入门:从零开始的操作指南
- 2024-11-07阿里云Redis学习:初学者指南
- 2024-11-06阿里云Redis入门教程:轻松搭建与使用指南
- 2024-11-02Redis项目实战:新手入门教程
- 2024-10-22Redis入门教程:轻松掌握数据存储与操作