前言
在上一篇文章中,我和大家介绍了Redis的前世今生,Redis的诞生就是为了解决mysql中IO性能的瓶颈,这一篇就和大家一起揭秘Redis神秘的面纱,第一个我们就来聊一聊Redis数据类型中的String!
Redis的数据结构
Redis最常用的数据类型有五种
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
五种其实是Redis键值对中值存储的数据类型,而他们的底层数据结构一共有6种:分别是
- 简单动态字符串
- 双向链表
- 压缩列表
- 哈希表
- 跳表
- 整数数组
数据类型和数据结构的对应关系如下图:
这张图会在未来几篇文章中反复出现,帮大家彻底了解Redis的基础类型。
今天我们就来聊一聊其中的string
Redis是用C写的,那为什么不用C语言的String?
众所周知,Redis是用C语言写的,那Redis为什么没有使用C原生的字符串,而是自己创建了一个简单动态字符串?(SDS simple dynamic string)
-
C语言的字符串底层是用字符数组来实现的,在一片连续的空间中依次存放字符,为了判断字符的结束,他会在最后以
'\0'
作为识别,这样就会带来以下问题- 无法存放任意的字符,至少
'\0'
是不可以的,这就会导致一些如图片,音频等出现了'\0'
就会出现问题。 - 对字符串进行追加等操作的时候,必须遍历到
'\0'
才可以操作,会导致效率比较低,复杂度为o(n)
- 无法存放任意的字符,至少
-
C语言的字符串是不记录字符串长度的,一旦我们调用了拼接函数等,而没有提前计算好内存,就会产生缓冲区溢出的情况,所以为了不出问题,会进行内存重分配,而这又多出了内存重分配的性能损耗。
那么,Redis是怎么处理这些问题的呢?
简单动态字符串(Redis5.0版本)
Redis中的字符串数据是通过简单动态字符串(以下简称SDS)来存储数据的。
SDS到底是什么?
我们先来看看SDS的结构长什么样