redis知识图谱总结
Posted go大鸡腿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis知识图谱总结相关的知识,希望对你有一定的参考价值。
前言
面试
在面很多高级岗位的时候,面试官会时不时来句redis底层数据结构,以及各种扩展,例如:
再如我面过很多大厂也会问我rehash,我当时???好吧,尽量完善自己的知识图谱
redis数据结构
本博客主要是观看《redis设计与实现》,然后进行个人的学习总结~
sds
simple dynamic string
它是字符串实现数据结构,特点:会保存使用字节的数量,以及未使用的字节的数量
好处:不会内存溢出,比如说缓冲区,既然我已经有了这个数值,你如果比我空闲的数量大,我需求进行扩容。数据个数,也不需要进行遍历,直接从属性里头拿就完事了。
扩展的过程
- 小于1M的时候会翻倍
- 大于1M的时候会扩展1M
好处是可以节约内存空间
字典
dic
如果遇到hash冲突也会变成链表,解决冲突
rehash
主要发生在扩容跟缩容情况下,它需要对之前的字典进行相应的扩展跟缩减,导致当前服务不可用,如果说字典很大的时候,会在复制的时候导致卡顿,所以有了rehash优化。
具体就是在复制阶段,会有ht[0],ht[1],有两张hash表,它会重新计算值在新表的位置,然后记录迁移的剩余数量。
查询的时候,会先去旧表,没有再去新表查询。插入直接往新表插,删除两张表都删除,这样做到同步。
跳表
skiplist
多层索引的列表,每个值1-32层,层数越高搜索越快。
然后它每个节点会记录,头尾节点,这样的话方便进行前进跟后退的遍历。
搜索过程:比如说从header开始,往最高层走,大于这个数,继续前进,小于的话就后退
跳表跟红黑树比较
实现会更简单,插入等等不需要说树的左右节点进行平衡
插入相同值
如果插入相同的值,它会根据节点对象进行排序
压缩列表
它会根据前一个节点的占用内存大小,来保存这个长度
连锁更新
在表头,中间插入新的节点,如果刚好需要在5个节点的长度的时候,后面那个节点也得扩容,一直传递下去。
redis持久化
RDB
全量保存redis命令,
命令 | |
---|---|
SAVE | 会阻塞服务,然后进行生成rdb文件 |
BGSAVE | 会fork子线程进行复制内存,生成rdb文件 |
big-key的问题
redis是单线程,会造成阻塞。其次是大key的话,在fork子线程复制的时候也会造成线程阻塞。
AOF
增量模式保存,也就是会缓存一些写的命令,然后到aof文件
复制
命令 | |
---|---|
sync | 会要求主服务进行传输rdb文件,还有写命令缓存区进行同步,如果断联之后会重新生成rdb文件 |
psync | 如果非首次同步,断联之后只是将丢失的写命令回传 |
redis 为啥很快
- 单线程,避免上下文切换
- 多路复用,linux epoll,在内核态跟用户态之间有一层映射mmap,然后有一个链表,如果有返回值往里面塞入
redis 高可用
- sentinel 客观、主观下线,raft选举,同步
- 集群,1W槽,根据hash算法去划分数据区域,方便扩展
以上是关于redis知识图谱总结的主要内容,如果未能解决你的问题,请参考以下文章