redis知识图谱总结

个人博客:进入博客,关注下博主,感谢~

所有博客均在上面博客首发,其他平台同步更新
大家一起进步,多多指教~
在这里插入图片描述

文章目录

  • 前言
  • 面试
  • redis数据结构
    • sds
    • 字典
      • rehash
    • 跳表
      • 跳表跟红黑树比较
      • 插入相同值
    • 压缩列表
      • 连锁更新
  • redis持久化
    • RDB
    • AOF
  • 复制
  • redis 为啥很快
  • redis 高可用

前言

面试

在面很多高级岗位的时候,面试官会时不时来句redis底层数据结构,以及各种扩展,例如:

  • 得物高工技术终面:redis数据结构底层实现

再如我面过很多大厂也会问我rehash,我当时???好吧,尽量完善自己的知识图谱

redis数据结构

本博客主要是观看《redis设计与实现》,然后进行个人的学习总结~

sds

simple dynamic string
它是字符串实现数据结构,特点:会保存使用字节的数量,以及未使用的字节的数量
好处:不会内存溢出,比如说缓冲区,既然我已经有了这个数值,你如果比我空闲的数量大,我需求进行扩容。数据个数,也不需要进行遍历,直接从属性里头拿就完事了。
redis知识图谱总结_第1张图片
扩展的过程
redis知识图谱总结_第2张图片

  1. 小于1M的时候会翻倍
  2. 大于1M的时候会扩展1M

好处是可以节约内存空间

字典

dic
redis知识图谱总结_第3张图片
如果遇到hash冲突也会变成链表,解决冲突

rehash

redis知识图谱总结_第4张图片

主要发生在扩容跟缩容情况下,它需要对之前的字典进行相应的扩展跟缩减,导致当前服务不可用,如果说字典很大的时候,会在复制的时候导致卡顿,所以有了rehash优化。
具体就是在复制阶段,会有ht[0],ht[1],有两张hash表,它会重新计算值在新表的位置,然后记录迁移的剩余数量。
查询的时候,会先去旧表,没有再去新表查询。插入直接往新表插,删除两张表都删除,这样做到同步。

跳表

skiplist
多层索引的列表,每个值1-32层,层数越高搜索越快。
然后它每个节点会记录,头尾节点,这样的话方便进行前进跟后退的遍历。
redis知识图谱总结_第5张图片

搜索过程:比如说从header开始,往最高层走,大于这个数,继续前进,小于的话就后退

跳表跟红黑树比较

实现会更简单,插入等等不需要说树的左右节点进行平衡

插入相同值

redis知识图谱总结_第6张图片
如果插入相同的值,它会根据节点对象进行排序

压缩列表

它会根据前一个节点的占用内存大小,来保存这个长度

连锁更新

redis知识图谱总结_第7张图片
在表头,中间插入新的节点,如果刚好需要在5个节点的长度的时候,后面那个节点也得扩容,一直传递下去。

redis持久化

RDB

全量保存redis命令,

命令
SAVE 会阻塞服务,然后进行生成rdb文件
BGSAVE 会fork子线程进行复制内存,生成rdb文件

big-key的问题

redis是单线程,会造成阻塞。其次是大key的话,在fork子线程复制的时候也会造成线程阻塞。

redis知识图谱总结_第8张图片

AOF

增量模式保存,也就是会缓存一些写的命令,然后到aof文件

复制

命令
sync 会要求主服务进行传输rdb文件,还有写命令缓存区进行同步,如果断联之后会重新生成rdb文件
psync 如果非首次同步,断联之后只是将丢失的写命令回传

redis 为啥很快

  1. 单线程,避免上下文切换
  2. 多路复用,linux epoll,在内核态跟用户态之间有一层映射mmap,然后有一个链表,如果有返回值往里面塞入

redis 高可用

  1. sentinel 客观、主观下线,raft选举,同步
  2. 集群,1W槽,根据hash算法去划分数据区域,方便扩展

你可能感兴趣的:(面试,redis,知识图谱,面试)