Redis为什么那么快?

Redis因其高性能而被广泛应用,其单线程模型、内存中的数据操作及异步非阻塞I/O使其处理速度极快。Redis内部使用HashMap实现,提供O(1)的查找和操作效率。单线程避免了线程上下文切换、资源竞争和锁操作带来的开销。此外,Redis使用I/O多路复用技术如epoll,解决了I/O阻塞问题,进一步提高了性能。
摘要由CSDN通过智能技术生成

Redis性能解析–Redis为什么那么快?

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

Redis的性能展示

在保证网络通畅的情况下,相同的CPU和相同的Redis版本,处理不同大小的数据,Redis的吞吐量如下图所示,该图来自Redis的官方网站。我们可以在网站中看到。Redis在处理1000字节的数据的时候,都是稳定位置吞吐量在10w,当处理的数据不断增大的时候,吞吐量才慢慢开始下降。

在这里插入图片描述
在这里插入图片描述
Redis为什么那么快?

纯内存KV操作
内部是单程实现的(不需要创建/销毁线程,避免上下文切换,无并发资源竞争的问题)
异步非阻塞的I/O(多路复用)
存内存KV操作快在哪里?
我们从上面的介绍里面我们看到了Redis是一个纯kv的操作。并且Redis绝大部分请求是纯粹的内存操作,所以速度非常快。数据存在内存中,类型与存在hashMap中,那么为什么那么快呢?我们可以一起来看一下几种常用数据结构的对比,和他们的优势。

在这里插入图片描述

从上图我们可以看出,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多路复用函数库来实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis之所以能够实现速的性能,是因为它是一种基于内存的键值存储,它将数据存储在内存中,可以比磁盘I / O更地访问数据。它还支持复杂的数据结构,如列表,集合,有序集合,哈希表等,可以更地执行复杂的操作。 ### 回答2: Redis之所以那么,可以归结为以下几个原因: 1. 内存存储:Redis是基于内存存储的数据库,它的数据存储在内存中,通过避免了硬盘的读写操作,大大提高了读写速度。内存的随机访问速度比硬盘几个数量级。 2. 单线程模型:Redis采用单线程模型,避免了多线程带来的竞争和冲突,简化了问题复杂度,提高了数据处理的效率。虽然是单线程,但通过多路复用技术,可以处理多个连接的请求。 3. 高效的数据结构:Redis支持丰富的数据结构,如字符串、哈希表、列表、集合和有序集合。它们都是直接以二进制方式存储在内存中,没有复杂的键值映射和解析过程,提高了数据的访问效率。 4. 高效的网络通信:Redis使用自己的协议进行网络通信,这个协议是基于TCP的、基于文本的简单协议。相较于其他复杂的协议,这个协议的消息大小较小,传输效率较高。 5. 预分配内存和写时复制:Redis在启动时会提前分配好所需的内存空间,避免了运行过程中频繁的内存分配操作。此外,Redis还实现了写时复制技术,即在进行写操作时,会复制出一个新的副本,使得读操作和写操作可以同时进行,提高了并发性能。 总的来说,Redis之所以速,是通过内存存储、单线程模型、高效的数据结构、高效的网络通信、预分配内存和写时复制等技术手段的综合运用,使得其在各个方面都具备了卓越的性能表现。 ### 回答3: Redis之所以的原因有以下几点: 1. 内存存储:Redis将数据存储在内存中,内存的读写速度远远高于磁盘的读写速度,因此能够实现非常的数据访问。 2. 单线程处理:Redis采用单线程模型,避免了线程切换的开销和线程之间的同步问题。由于单线程不需要考虑并发操作的问题,使得Redis能够更加高效地利用CPU资源。 3. 非阻塞IO:Redis使用了异步的IO模型,在等待IO操作的同时,可以处理其他的请求。这样可以避免由于IO阻塞而导致的系统性能下降。 4. 数据结构简单高效:Redis支持多种数据结构,如字符串、列表、哈希表等,这些数据结构都经过了精心优化,使得其在存储和访问上更加高效。 5. 持久化支持:Redis提供了两种持久化的方式,分别为RDB(照)和AOF(追加日志),可以将数据持久化到磁盘,保证数据的安全性。 6. 网络模型:Redis使用一个单一的TCP连接来处理所有的请求和响应,减少了网络连接的开销,提高了网络性能。 综上所述,Redis之所以速是因为它通过内存存储、单线程处理、非阻塞IO、简单高效的数据结构、持久化支持以及优化的网络模型等多方面的优化措施,使得其能够高效地处理大量的读写请求,从而达到出色的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值