相信大家都知道Redis吧,这是一个高性能的键值对数据库。Redis有着与其他缓存框架不一样的优势,丰富的数据类型,读写速度快,操作是原子性,并且有着丰富的特性。那么,你们知道redis为什么会这么快吗?原理是什么呢?下面就让小编带你来了解一下吧。
首先我们来了解一下redis到底有多快
Redis是采用基于内存的单进程单线程模型的 KV 数据库,目前官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。横轴是连接数,纵轴是QPS。这张图此时就反映了一个数量级。
Redis高效率原理
1、完全基于内存,大部分请求是纯粹的内存操作,速度极快。数据存在内存中,跟HashMap类似,HashMap优势就是查找与操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,并且不需要去考虑锁的问题,没有可能存在因为出现死锁导致的性能消耗。
4、使用多路I/O复用模型,非阻塞IO;
5、底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,redis是自己构建的VM机制 ,其他一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
由于进程的执行过程是线性的,当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞在这个调用上,不能执行其他操作,阻塞很正常.
接下来要考虑这么一个问题:一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将阻塞,直到客户端调用write(sockfd,but,size)发来数据。在一个客户和服务器通信时这没什么问题;当多个客户与服务器通信时当多个客户与服务器通信时,若服务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达套接字sockfd2时,服务器不能处理,仍然阻塞在read(sockfd1…)上;此时问题就出现了,不能及时处理另一个客户的服务,这该怎么办?
I/O多路复用来解决!I/O多路复用!继续上面的问题,有多个客户连接,sockfd1、sockfd2、sockfd3…sockfdn。同时监听这n个客户,当其中有一个发来消息时就从select的阻塞中返回,然后就调用read读取收到消息的sockfd,然后又循环回select阻塞;这样就不会因为阻塞在其中一个上而不能处理另一个客户的消息。“I/O多路复用”的英文是“I/O multiplexing”,可以百度一下multiplexing,就能得到这个图:
以上就是本篇文章的所有内容,更多详情请继续关注本站。