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

相关文章

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结