秋招突击——第八弹——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

相关文章

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

电子盖章怎么做_电子盖章软件

使用e-章宝(易友EU3000智能盖章软件)进行电子盖章的步骤如下: 一、准备阶段 软件获取: 访问e-章宝(易友EU3000智能盖章软件)的官方网站或相关渠道,下载并安装软件。账户注册与登录: 首次使用需注册账户,并根据指引完成注册流程。注册完成后,使用用户名和密码登录软件。 二、电子盖章操作 文档导入: 在e-章宝软件中,点击“添加”按钮,导入待盖章的PDF文件。支持批量导入多个文件,

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的,那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的? 这时候我们经常会得到沉默,所以对于这道题,笔者会直接通过3.0.0源码分析的角度来剖析一下redis单线程的设计与实现。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version