作者:GrimMjx
目录
开发语言纯内存访问单线程非阻塞多通道I/O 复用机制
前言
Redis 是一个基于键值对(Key-Value)的NoSQL 数据库。字符串、哈希、列表、集合、zset、位图、HyperLogLog 以及其他数据结构和算法。
Redis还提供密钥过期、发布订阅、事务、Lua脚本、哨兵、集群等功能。 Redis执行命令的速度非常快,根据官方表现可以达到10w+qps。
因此,在这篇文章中,我们将介绍Redis到底有多快,主要关注以下几点。
一.开发语言
现在我们都使用Java、Python等高级语言进行编程。 C 可能看起来很过时,但它确实很有用。 Unix系统是用C实现的,因此C语言与操作系统非常接近。 Redis是用C语言开发的,运行速度更快。
另外我想说,大学生如果学好C语言,对计算机操作系统会有更深入的了解。不要以为学了高级语言就不需要关注底层了。欠下的债总是需要偿还的。这里推荐难度较大的书《深入理解计算系统》。
二.纯内存访问
Redis 将所有数据放入内存中。非数据同步工作正常,不需要从磁盘读取数据。 IO时间为0。内存响应时间约为100纳秒,这是Redis高速的关键基础。首先,我们来看看CPU的速度。
以我的电脑为例,主频是3.1G。这意味着它每秒可以执行3.1*10^9 条指令。那么CPU看世界的速度非常慢,内存慢100倍,磁盘慢100万倍?
我借用了图像《深入理解计算机系统》。 CPU可以在一个时钟周期内访问L0层。基于SRAM 的高速缓存周期可以在几个CPU 时钟周期内访问。基本主内存。它可以在数十到数百个时钟周期内被访问。
三.单线程
首先,虽然单线程简化了算法实现,但并发数据结构不仅难以实现,而且测试起来也很繁琐。其次,单线程避免了线程切换和加锁、释放锁的消耗。在服务器端开发中,加锁和线程切换通常会导致性能下降。
当然,单线程也有它的缺点,那就是阻塞,这是Redis的噩梦。如果某个命令运行时间过长,其他命令将被阻塞。这对于Redis来说是非常致命的,所以Redis是一个针对快速执行场景的数据库。
除了Redis之外,Node.js也是单线程,Nginx也是单线程,但两者都是高性能服务器模型。
四.非阻塞多路I/O复用机制
但首先,我们来讨论一下传统的阻塞I/O 的工作原理。当使用read或write读取或写入特定文件描述符(文件描述符FD)时,如果没有接收到数据,则线程被挂起,直到下一个点。收到数据。虽然阻塞模型很容易理解,但是当需要处理多个客户端任务时,不使用它。
I/O 多路复用实际上意味着多个连接可以由同一个进程管理。多通道是指网络连接,复用只是同一个线程。在网络服务中,I/O复用的作用是一次性通知业务代码多个连接事件,处理方式由业务代码决定。
在I/O复用模型中,最重要的函数调用是I/O复用函数。该方法可以同时监控对多个文件描述符(FD)的读取和写入。对于读/写,该方法返回读/写FDS的数量。
Redis使用epoll作为I/O复用技术的实现,并且Redis独特的事件处理模型将epoll的读、写、关闭等转换为事件,这在网络I/O上浪费了大量的时间我尽量不做。到。实现多个FD的读写监控,提高性能。
我们来看一个生动的例子。例如,TCP 服务器处理20 个客户端套接字。
计划A:顺序处理。如果第一个套接字由于你的网卡而读取数据很慢,那么它被阻塞后一切都会被毁掉。
B 计划:创建一个克隆子进程来处理每个套接字请求。不用说,每个进程都会消耗大量的系统资源,光是进程之间的切换就足以让操作系统疲劳。
Plan C(I/O复用模型,epoll):在epoll中注册用户socket对应的fd(服务器和OS之间实际传递的并不是socket的fd,而是fd_set的数据结构)。然后,epoll 只是告诉你,对于需要读/写的套接字,只应处理活动的和变化的套接字fd。这样整个进程只在调用epoll时被阻塞,而不会阻塞发送或接收客户消息。
来源:cnblogs.com/GrimMjx/p/10662254.html
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。