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

2024-06-23 17:36

本文主要是介绍秋招突击——第八弹——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持久化看的有点懵,这个写时复制在背操作系统的时候看过,但是没理解,现在看还是没有理解。
  • 先背着,后续有时间再往下继续看,时间不多了,得继续加快进度。

这篇关于秋招突击——第八弹——Redis是怎么运作的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087823

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错