您的位置:首页 > 娱乐 > 八卦 > 秋招突击——第八弹——Redis是怎么运作的

秋招突击——第八弹——Redis是怎么运作的

2024/12/23 14:00:01 来源:https://blog.csdn.net/Blackoutdragon/article/details/139882471  浏览:    关键词:秋招突击——第八弹——Redis是怎么运作的

文章目录

    • 引言
    • 正文
      • Redis在内存中是怎么存储的
          • 面试重点
      • Redis是单线程还是多线程
          • 面试重点
      • 内存满了怎么办?
        • 面试重点
      • 持久化介绍
        • 面试重点
      • RDB持久化
        • 面试重点
      • AOF日志
        • 面试重点
    • 总结

引言

  • 差不多花了两天把redis给过了,早上也只背了一半,完成回去的时候,在背一会,还有健身的时候在听一会。加油,完成不要睡太晚了,早上起不了,还容易做噩梦。

正文

Redis在内存中是怎么存储的

在这里插入图片描述
dict字典的存储结构

在这里插入图片描述

在这里插入图片描述
添加元素

  • 这个字典对应一下存储结构
    在这里插入图片描述

过期字典

  • 这里所有的key都是指向内存的某一个对象
    在这里插入图片描述
面试重点

set a b 这个数据的存储结构是怎么样的?

  • redis存储是字典结构,set a b之后,a会放在字典对应的偏移位置,b作为对应的value进行存储。

过期的信息会存储在哪里?

  • 如果添加了某一个元素的过期时间,则会立马将key添加到过期字典中,并存储对应的时间戳。

有个key过期事件后,那么既在字典还是过期字典,会有两份吗

  • 这里保存的都是指针,对象的指针,不会重复占用内存。

Redis是单线程还是多线程

  • 执行始终是单线程

为什么用单线程

  • redis的瓶颈是IO操作,并不是CPU操作,基于这个投入产出比,还是使用的单线程。

在这里插入图片描述

为什么单线程还这么快?
在这里插入图片描述

  • 高效的数据结构,保证了访问速度
  • I/O多路复用

Reactor模型

在这里插入图片描述

  • 针对命令可以执行之后,就阻塞,不再管他,这里使用事件通知epoll模式解决不同步的问题。

在这里插入图片描述

  • 每一个请求都会触发,触发之后就会发送到对应的句柄,进行处理。
面试重点

redis是单线程还是多线程

  • 核心处理逻辑,Redis一直是单线程的;某些异步流程从4.0开始用多线程,如UNLINK、FLUSHALL ASYNC等非阻塞操作网络I0解包从6.0开始用的都是多线程

为什么使用单线程

  • 瓶颈在I/0不是CPU,这种情况下,选择多线程成本和复杂性高,综合投入产出比,所以选择了单线程

为什么单线程还那么快?

  • Redis是内存数据库,内存操作本身就很快
  • 同时Redis选了高效的数据结构,很多对象底层有多种实现以应对不同的场景,追求性能的极致。
  • 最后Redis采用了多路复用的机制,使其在网络10操作中能并发处理大量的客户端请求,实现高吞吐量

内存满了怎么办?

在这里插入图片描述

  • 超过了操作系统最大的存储范围时,再继续添加数据
  • 总共有8种淘汰策略

在这里插入图片描述

LRU算法

  • 最近最久未使用的数据优先被淘汰
  • 成本:双链表,巨大内存消耗
  • redis选择近似LRU算法,方式消耗更多内存
    • 每次随机选择特定数量的数据,在选中的数据中最不常用的淘汰
  • 为了提高效率,这里选择维护随机池,大小是16个
    在这里插入图片描述
  • 经过验证,是有效的!
  • 缺陷
    • 只管最近访问时间,不会考虑频率
      在这里插入图片描述

LFU算法

  • 针对LRU的仅考虑访问时间的缺点,做的改良
    • LFU同时记录访问的频率还有上一次访问的时间戳

在这里插入图片描述
在这里插入图片描述

  • 决定效果是访问计数:
    • 根据当前时间和上一次访问时间戳,计算衰减系数
    • 如果被访问到,访问计数有概率增加,100之前每一次访问都会加1,如果超过一百,每次有一定的概率增加1

难度调节
在这里插入图片描述

面试重点

Redis有几种内存回收策略
内存回收,什么时候发起

  • 每次读写的时候,都会检查是否需要释放内存,如果需要,就会触发。

介绍一下LRU回收算法

  • 近似LRU算法,是否需要我继续往下讲讲?
  • 没有淘汰池的情况
  • 增加淘汰池的情况

什么是LFU算法

  • 将访问频率也加入到影响因素中,同时记录访问计数和上一次访问的时间戳。

持久化介绍

是什么?

  • 遇到崩溃重启时,原来已有的数据在重启之后,能够重新恢复。
  • 具有一下几种方式
    • RDB快照
    • AOF日志

RDB和AOF的区别

  • AOF是先写进缓冲区,最后再刷盘,在这段时间会有问题
    在这里插入图片描述
    加载策略
    在这里插入图片描述
  • 不要把潜在的问题埋起来,要暴露出来
面试重点

Redis为什么要持久化

  • 定义 + 场景

RDB和AOF的区别

  • 本质:快照和日志
  • 安全性:在于丢失的文件多少
  • 恢复速度:RDB二进制文件,恢复速度更快
  • 操作的开销

RDB和AOF应该如何选择

  • 混合持久化,尽量保证数据安全
  • 接受分钟级别的丢失,那就RDB
  • 不能只选择的AOF,这样不安全

同时加载AOF和RDB,启动时,会用哪个

  • 只会用AOF,既然开启了AOF,想要保证数据丢失少。即使没有AOF文件,也会创建一个空库,暴露出对应的问题。

RDB持久化

在这里插入图片描述

  • RDB保存到磁盘的文件后缀是RDB

开启RDB

  • 900秒内,有一次操作,会进行RDB的备份
  • 一分钟内,有一万次操作,也会执行RDB
    在这里插入图片描述
  • 使用命令,进行持久化
    • 顶时持久化的模式,是采用后台持久化

在这里插入图片描述

RDB写入流程到底是怎么样的?

  • 先调用fork创建子进程,子进程将数据写入临时文件,然后替代原来的文件,实现写时复制
    在这里插入图片描述
  • 父进程fork创建子进程实现RDB新的创建
    在这里插入图片描述

写时复制

  • 如果fork一条数据后,这个数据是两份吗?并不是,谁写谁复制下,写的时候复制。
  • 谁来更改,谁来复制一份。
  • 子进程不会接受命令的,触发写时复制的,一定是父进程。

在这里插入图片描述

面试重点

RDB是什么?解决了什么问题?

  • 二进制形式的快照

RDB怎么开启

  • 定时(后台持久化)和主动命令

RDB对主流程有什么影响
在这里插入图片描述

RDB写入流程是什么?写时复制的机制。
在这里插入图片描述

AOF日志

开启AOF
在这里插入图片描述
怎么写入AOF
在这里插入图片描述
AOF刷盘策略
在这里插入图片描述

  • 不同写回策略的问题
    在这里插入图片描述

AOF重写
在这里插入图片描述

面试重点

AOF是默认开启的吗

  • RDB是默认开启,AOF是不是

AOF重写是解决什么问题的

  • 重写是用于解决AOF不断膨胀问题,随着命令越来越多,AOF文件越来越大但是很多数据其实不一定都是还有意义的,比如原来seta3,后面又有个seta100,那么前者就不需要再继续了。重写就是通过当前状态,重新生成最新的AOF操作命令记录的过程。

AOF重写流程
在这里插入图片描述

总结

  • 这里的RDB持久化看的有点懵,这个写时复制在背操作系统的时候看过,但是没理解,现在看还是没有理解。
  • 先背着,后续有时间再往下继续看,时间不多了,得继续加快进度。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com