本文转载自:一文详解Redis面试中常见的5种数据结构及对应使用场景
写在前边
也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的技术有多牛比,只看拧螺丝的手艺瓷不瓷实。毕竟以后是一个整体,拖了大家后腿团队都很难受。面试的题目一般也不会太难,就像问Redis
,我只是想确认他真正用过就够了。Redis
5种基础数据结构和简单操作要知道,最基本的要求,如果这个时候他会说出每种数据结构大致的应用场景,那么这一定是加分的,起码要比那些只会说出几种数据结构后,在那干瞪眼等我问下一个问题的强很多,千万别冷场。
Redis基础数据结构有哪些?
一、String(字符串)
在任何一种编程语言里,字符串String
都是最基础的数据结构, 那你有想过Redis
中存储一个字符串都进行了哪些操作嘛?
在Redis
中String
是可以修改的,称为动态字符串
(Simple Dynamic String
简称 SDS
)(快拿小本本记名词,要考的),说是字符串但它的内部结构更像是一个 ArrayList
,内部维护着一个字节数组,并且在其内部预分配了一定的空间,以减少内存的频繁分配。
Redis
的内存分配机制是这样:
- 当字符串的长度小于 1MB时,每次扩容都是加倍现有的空间。
- 如果字符串长度超过 1MB时,每次扩容时只会扩展 1MB 的空间。
这样既保证了内存空间够用,还不至于造成内存的浪费,字符串最大长度为 512MB
.。
上图就是字符串的基本结构,其中 content
里面保存的是字符串内容,0x\0
作为结束字符不会被计算len
中。
分析一下字符串的数据结构
struct SDS{
T capacity; //数组容量
T len; //实际长度
byte flages; //标志位,低三位表示类型
byte[] content; //数组内容
}
capacity
和 len
两个属性都是泛型,为什么不直接用int类型
?因为Redis
内部有很多优化方案,为更合理的使用内存,不同长度的字符串采用不同的数据类型表示,且在创建字符串的时候 len
会和