数据库|15张图解Redis为什么这么快


数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
文章图片
数据库|15张图解Redis为什么这么快
工作中你肯定和 Redis 打过交道 。 Redis 为什么快 , 这点想必你也知道 , 至少为了面试也做过准备 。 很多人知道 Redis 快仅仅因为它是基于内存实现的 , 对于其它原因倒是模棱两可 。

那么今天就和小编一起看看:

- 思维导图 -

基于内存实现
这点在一开始就提到过了 , 这里再简单说说 。
Redis 是基于内存的数据库 , 那不可避免的就要与磁盘数据库做对比 。 对于磁盘数据库来说 , 是需要将数据读取到内存里的 , 这个过程会受到磁盘 I/O 的限制 。
而对于内存数据库来说 , 本身数据就存在于内存里 , 也就没有了这方面的开销 。
高效的数据结构
Redis 中有多种数据类型 , 每种数据类型的底层都由一种或多种数据结构来支持 。 正是因为有了这些数据结构 , Redis 在存储与读取上的速度才不受阻碍 。 这些数据结构有什么特别的地方 , 各位看官接着往下看:

1、简单动态字符串
这个名词可能你不熟悉 , 换成 SDS 肯定就知道了 。 这是用来处理字符串的 。 了解 C 语言的都知道 , 它是有处理字符串方法的 。 而 Redis 就是 C 语言实现的 , 那为什么还要重复造轮子?我们从以下几点来看:
(1)字符串长度处理

这个图是字符串在 C 语言中的存储方式 , 想要获取 「Redis」的长度 , 需要从头开始遍历 , 直到遇到 '\\0' 为止 。

Redis 中怎么操作呢?用一个 len 字段记录当前字符串的长度 。 想要获取长度只需要获取 len 字段即可 。 你看 , 差距不言自明 。 前者遍历的时间复杂度为 O(n) , Redis 中 O(1) 就能拿到 , 速度明显提升 。

(2)内存重新分配

C 语言中涉及到修改字符串的时候会重新分配内存 。 修改地越频繁 , 内存分配也就越频繁 。 而内存分配是会消耗性能的 , 那么性能下降在所难免 。

而 Redis 中会涉及到字符串频繁的修改操作 , 这种内存分配方式显然就不适合了 。 于是 SDS 实现了两种优化策略:

  • 空间预分配
对 SDS 修改及空间扩充时 , 除了分配所必须的空间外 , 还会额外分配未使用的空间 。
具体分配规则是这样的:SDS 修改后 , len 长度小于 1M , 那么将会额外分配与 len 相同长度的未使用空间 。 如果修改后长度大于 1M , 那么将分配1M的使用空间 。