Redis性能解析--Redis为何那么快?

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!!redis


Redis的实际被应用都是由于它的性能,在众多缓存中Redis也是一个比较快的中间件,并且它是单线程操做,没有过的内存开销,给程序带来了更多的扩展空间。缓存

Redis的性能展现

在保证网络通畅的状况下,相同的CPU和相同的Redis版本,处理不一样大小的数据,Redis的吞吐量以下图所示,该图来自Redis的官方网站。咱们能够在网站中看到。Redis在处理1000字节的数据的时候,都是稳定位置吞吐量在10w,当处理的数据不断增大的时候,吞吐量才慢慢开始降低。
在这里插入图片描述
图片来自redis官网微信

下图是提供的QPS测试图,官方提供的数据是能够达到100000+的QPS(每秒内查询次数)。
在这里插入图片描述
图片来自redis官网网络

Redis为何那么快?

  • 纯内存KV操做
  • 内部是单程实现的(不须要建立/销毁线程,避免上下文切换,无并发资源竞争的问题)
  • 异步非阻塞的I/O(多路复用)

存内存KV操做快在哪里?

咱们从上面的介绍里面咱们看到了Redis是一个纯kv的操做。而且Redis绝大部分请求是纯粹的内存操做,因此速度很是快。数据存在内存中,类型与存在hashMap中,那么为何那么快呢?咱们能够一块儿来看一下几种经常使用数据结构的对比,和他们的优点。数据结构

数据结构 操做 时间复杂度
List insert O(N)
List select O(1)
Set insert O(1)
Set select O(1)
HashMap insert O(1)
HashMap select O(1)

从上图咱们能够看出,HashMap的优点就是查找和操做的时间复杂度都是O(1),因此Redis内部采用这种结构可以从根本上得到足够的优点,当让,Redis的快速不只仅是数据结构成就的,还有单程成和异步I/O多线程

Redis为何使用单线程?

Redis使用单线程就够了!咱们能够看到下图中官网的描述,Redis的使用瓶颈并非CPU,它主要受到内存和网络的限制。例如,使用在通常Linux系统上运行的流水线Redis每秒能够发送一百万个请求,所以,若是您的应用程序主要使用O(N)或O(log(N))命令,则几乎不会使用过多的CPU 。
在这里插入图片描述并发

从描述中咱们能够看到,Redis在使用的时候,使用单线程就已经可以获取Redis足够使用的CPU资源,主要的瓶颈在于内存。可是单线程为何可以作到这么快的速度的呢?异步

Redis使用单线程,相比于多线程快在哪里?

从上面官网的介绍咱们看到了,Redis的瓶颈不在线程,不在获取CPU的资源,因此若是使用多线程就会带来多余的资源占用。好比上下文切换、资源竞争、锁的操做。函数

  • 上下文的切换
    • 上下文其实不难理解,它就是CPU寄存器和程序计数器。主要的做用就是存放没有被分配到资源的线程,多线程操做的时候,不是每个线程都可以直接获取到CPU资源的,咱们之因此可以看到咱们电脑上可以运行不少的程序,是应为多线程的执行和CPU不断对多线程的切换。可是总有线程获取到资源,也总有线程须要等待获取资源,这个时候,等待获取资源的线程就须要被挂起,也就是咱们的寄存。这个时候咱们的上下文就产生了,当咱们的上下文再次被唤起,获得资源的时候,就是咱们上下文的切换。
  • 竞争资源
    • 竞争资源相对来讲比较好理解,CPU对上下文的切换其实就是一种资源分批,可是在切换以前,到底切换到哪个上下文,就是资源竞争的开始。在我redis中因为是单线程的,因此全部的操做都不会涉及到资源的竞争。
  • 锁的消耗
    • 对于多线程的状况来说,不能回避的就是锁的问题。若是说多线程操做出现并发,有可能致使数据不一致,或者操做达不到预期的效果。这个时候咱们就须要锁来解决这些问题。当咱们的线程不少的时候,就须要不断的加锁,释放锁,该操做就会消耗掉咱们不少的时间

I/O复用,非阻塞模型

对于I/O阻塞可能有不少人不知道,I/O操做的阻塞究竟是怎么引发的,Redis又是怎么解决的呢?性能

  • I/O操做的阻塞:当用户线程发出IO请求以后,内核会去查看数据是否就绪,若是没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪以后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。
  • Redis采用多路复用:I/O 多路复用实际上是在单个线程中经过记录跟踪每个sock(I/O流) 的状态来管理多个I/O流。select, poll, epoll 都是I/O多路复用的具体的实现。epoll性能比其余几者要好。redis中的I/O多路复用的全部功能经过包装常见的select、epoll、evport和kqueue这些I/O多路复用函数库来实现的。

作一个有底线的博客主

相关文章
相关标签/搜索