个人博客:进入博客,关注下博主,感谢~
所有博客均在上面博客首发,其他平台同步更新
大家一起进步,多多指教~
在面很多高级岗位的时候,面试官会时不时来句redis底层数据结构,以及各种扩展,例如:
再如我面过很多大厂也会问我rehash,我当时???好吧,尽量完善自己的知识图谱
本博客主要是观看《redis设计与实现》,然后进行个人的学习总结~
simple dynamic string
它是字符串实现数据结构,特点:会保存使用字节的数量,以及未使用的字节的数量
好处:不会内存溢出,比如说缓冲区,既然我已经有了这个数值,你如果比我空闲的数量大,我需求进行扩容。数据个数,也不需要进行遍历,直接从属性里头拿就完事了。
扩展的过程
好处是可以节约内存空间
主要发生在扩容跟缩容情况下,它需要对之前的字典进行相应的扩展跟缩减,导致当前服务不可用,如果说字典很大的时候,会在复制的时候导致卡顿,所以有了rehash优化。
具体就是在复制阶段,会有ht[0],ht[1],有两张hash表,它会重新计算值在新表的位置,然后记录迁移的剩余数量。
查询的时候,会先去旧表,没有再去新表查询。插入直接往新表插,删除两张表都删除,这样做到同步。
skiplist
多层索引的列表,每个值1-32层,层数越高搜索越快。
然后它每个节点会记录,头尾节点,这样的话方便进行前进跟后退的遍历。
搜索过程:比如说从header开始,往最高层走,大于这个数,继续前进,小于的话就后退
实现会更简单,插入等等不需要说树的左右节点进行平衡
它会根据前一个节点的占用内存大小,来保存这个长度
在表头,中间插入新的节点,如果刚好需要在5个节点的长度的时候,后面那个节点也得扩容,一直传递下去。
全量保存redis命令,
命令 | |
---|---|
SAVE | 会阻塞服务,然后进行生成rdb文件 |
BGSAVE | 会fork子线程进行复制内存,生成rdb文件 |
big-key的问题
redis是单线程,会造成阻塞。其次是大key的话,在fork子线程复制的时候也会造成线程阻塞。
增量模式保存,也就是会缓存一些写的命令,然后到aof文件
命令 | |
---|---|
sync | 会要求主服务进行传输rdb文件,还有写命令缓存区进行同步,如果断联之后会重新生成rdb文件 |
psync | 如果非首次同步,断联之后只是将丢失的写命令回传 |