redis为什么那么快

redis为什么那么快

redis快的原因

  1. 纯内存操作(最主要)
  2. 合适的线程模型
  3. 优秀的数据结构
  4. 合理的数据编码方式

纯内存操作

最主要的原因:redis的数据操作是基于内存的。

内存的访问速度是远远大于硬盘访问速度的。

拿数据库(硬盘)和 redis (内存)对比,一个操作对应磁盘,一个操作对应内存。他们两个的的访问速度差了一个数量级。

image-20220922160952832

这个时候有人会问了,redis不是有数据持久化吗?

怎么会只操作内存呢?

redis 持久化线程和操作内存数据的线程,并不是一个线程,我们这里说的 redis 快,只是针对操作内存的线程来说的,操作很快。因为操作是直接客户端响应时间息息相关的。

合适的线程

单线程

*先说一个常见误区, 就是大家在其他的文章或者面试题中,通过一段时间的以讹传讹。
大家都认为 redis 速度快,有一个原因是单线程!!!

在这里先反驳一下这个观点,这个结论是个明显的因果颠倒,主次不分的结论!!

首先单线程 redis 不是纯粹的单线程,我们所知晓的 redis 单线程只有 网络请求模块数据操作模块是单线程的

redis怎么不需要多线程呢

我们从上面的计算机操作分类来说

  1. 从 CPU 计算来说,redis 操作都是基于内存操作,很少有一些耗费CPU 的计算操作,对于 redis 操作来说,CPU 计算不是瓶颈,瓶颈在于 redis 操作内存的速度

  2. 从网络 IO 来说,redis网络 IO 接收事件,确实是一个很需要去提升的点 因为所有客户端对 redis 的操作 最终都会由 redis 的网络模块接受 ,所以对于 redis 来说 提升网络 IO 的利用率 很有必要

    结论:redis在cpu计算上不存在瓶颈,性能瓶颈只存在于网络IO中

但是~想要提高网络 IO 的利用率,不是只有多线程一条路。

  1. redis 由于历史遗留原因最终没有采用多线程处理网络 IO 而是采取了 单线程 + 多路复用器处理。
  2. 在2020年,redis 6.0版本 已经开始做多线程处理网络 IO ,性能提升巨大。

单线程模式下快的原因

下面我们就要说一下在单线程模式下,redis 快的原因,用四个字就可以来形容这个原因,那就是 多路复用

简单理解就是 单个线程同时检测若干个网络连接(Socket)是否可以执行IO操作的能力,就是将多个进程的网络 IO Socket注册到同一个管道上。 用最少的资源,干最多的事情。

比较传统的方式是使用多线程模型,每来一个客户端连接,就分配一个线程,然后后续的读写都在对应的进程/线程,这种方式处理 100 个客户端没问题,但是当客户端增大到 10000 个时,10000 个进程/线程的调度、上下文切换以及它们占用的内存,都会成为瓶颈。

为了解决上面这个问题,就出现了 I/O 的多路复用,可以只在一个进程里处理多个文件的 I/O
image-20220922163538856

所有的 io 操作 由这一个管道来和内核进行统一交互 管道中的io请求数据准备好之后 管道会将数据 拷贝到用户空间中。

redis 中,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。

多路复用模型显而易见的好处:

  1. 单线程,省去多个线程创建和上下文切换操作
  2. Socket 连接不多的情况,性能甚至比多线程有可能要高

优秀的数据结构

edis的五种数据类型主要有:

  1. String 整数浮点数或者字符串
  2. Set 集合
  3. Zset 有序集合
  4. Hash 散列表
  5. List 列表

image-20220926102153446

合理的数据编码方式

怎么理解这个合理的编码方式呢?

我们还是以 redis 中的 string 结构举例子,redis为了存储不同大小的字符串,精心设计了 5 种类型。
sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64
它们的不同就是,本身的数据类型不同,举个例子

  1. sdshdr16 中的字段分配大小是 uint16 2^16
  2. sdshdr32 中的字段分配大小是 uint32 2^32

结论: 通过这种能够灵活存储不同大小的字符串,有效的节省了内存。字符串大的时候分配大的内存空间,小的时候就分配小的,高效利用内存。

总结

  1. 纯内存操作
  2. 多路复用线程模型
  3. 优秀的数据结构
  4. 合理的数据编码方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值