redis 面试问题 (更新中 ing)

目录

        • reids 是做什么的
        • 为什么那么快
        • 有哪些使用场景
        • redis有哪些 数据结构
        • redis 有哪些底层数据结构
        • 为什么设计 sds
        • 一个 字符串 存储多大容量
      • stream
        • 为什么设计 stream
        • stream 消费者消息丢失
        • stream 消息私信问题
      • 持久化机制
        • redis 持久化机制,优缺点,怎么用
        • rdb 又是怎么触发的呢
        • rdb 期间 ,内存很大,如果有写操作,如何保证数据一致性
        • 主进程 fork 子进程如何复制数据
        • 那么 rdb 期间,服务崩溃怎么办
        • 那么 aof 如何实现呢
        • 什么是 aof 重写
        • aof 重写时,主线程有哪些地方会被阻塞
        • aof 重写时,有新数据写入 怎么办?

reids 是做什么的
为什么那么快
有哪些使用场景

1.数据缓存
2.计数器
3.限时
4.限流
5.分布式锁
6.队列
7.发布 订阅

redis有哪些 数据结构

常用的

  • string 对字符串 、整数、浮点数
  • list 链表 ,字符串
  • set 不重复集合 ,交集、并集 差集
  • hash 无序散列
  • zset 不重复 分数排序 排行榜
    特殊的
  • 基数统计 hyperloglogs
  • 位图 bitmaps
  • 地理位置 geo
redis 有哪些底层数据结构
  • sds 动态字符串
  • quicklist 快表
  • ziplist
  • inset
  • dict
  • skiplist
为什么设计 sds
  • 常数复杂度获取字符串长度
  • 杜绝缓冲区溢出,先判断长度
  • 减少内存分配 次数,预分配,惰性释放空间
  • 兼容部分 c 函数
  • 二进制安全 ,图片,空字符,特殊符号 存储 ,判断结束
一个 字符串 存储多大容量
  • 512m

stream

为什么设计 stream

redis 支持发布订阅功能,但是有缺陷

  • list和 zet ,支持持久化,不支持主播、多播
  • pub、sub,不支持持久化,dwon 机消息丢失,
    参考 kafka,设计了 stream,支持消息回溯,消费者组
stream 消费者消息丢失
  • 对于组内消费者消费消息,现记录读取位置,消费完,回复 ack,记录消息过,如果消费者宕机,可以调用查询 pengding 列表,读取已经 读取未成功消费的消息
stream 消息私信问题
  • 对于反复失败的 消息,redis 会记录失败次数,达到一定次数 ,会打标记,消费者查询该标记,可以决定 是删除 还是怎么 处理

持久化机制

redis 持久化机制,优缺点,怎么用

主要采用两种方式

  • 存量复制,采用 rdb 持久化,对已经存在的大量数据拍快照, 速度快,耗内存大
  • 增量复制,如果只采用 rdb,redis 数据每次写入,都要实时持久化吗,不合适,所以有了 aof 日志,可以把 redis 命令通过文本 方式实时的追加到文件中
  • redis 4.0 采用混合模式 ,rdb 定时执行,期间的命令,采用 aof 追加,这样既避免了 fork 子进程对内存 的影响,有可以记录所有 的命令
rdb 又是怎么触发的呢
  • 手动触发
  • save 命令,主进程执行,会阻塞客户端,生产环境禁止使用
  • bgsave 命令,新版 redis 推出,fork 一个子进程,后台 执行,阻塞只发生在 fork 阶段,其他没事
  • 自动触发
  • 配置文件配置 save m 秒 n 次
  • 主从复制,从节点 执行全量复制时
  • 执行shutdown 命令,没有开启 aof 时,也会进行
  • 执行 debug reload 命令,重新加载 redis 触发
rdb 期间 ,内存很大,如果有写操作,如何保证数据一致性
  • rdb 采用 copy-on-write,通过 fork 一个子进程进行,假设 t0redis 启动 t1 执行 rdb 命令 ,rdb 先 fork 一个主进程备份 t0-t1 期间的数据,假设备份 完成时间 t2,那么 t1-t2 期间数据怎么办?
  • rdb 期间,redis 会 提供一个内存缓冲期,t1-t2 期间的都copy 一份副本,写入这个缓冲区 ,带 rdb 完后,同步回去

在这里插入图片描述

主进程 fork 子进程如何复制数据
  • fork 命令有 操作系统提供,不会复制 一份内存,只会复制 虚拟页表的对应关系,会耗费 cpu resource
  • 当客户端读取数据,直接读取主进程数据
  • 当客户端写入数据,会 copy 一份副本 出来

在这里插入图片描述

那么 rdb 期间,服务崩溃怎么办
  • rdb 是定时执行的,redis 会存储最近的 rdb 快照,如果最新的一次崩溃, 这次 rdb 就不算 成功,那么重启 redis,就会使用上一次成功的 rdb 快照恢复
  • 期间数据会丢失部分
    既然数据会丢失,可以每 s 一次吗
  • 非常不建议,这样很耗费资源
  • fork 子进程耗费 cpu 和内存,多次 bgsave,会阻塞主进程
  • 备份多个,耗费磁盘
  • 建议采用 aof 和 rdb 结合的方式
那么 aof 如何实现呢
  • aof 日志是记录redis 的每个写命令,每次 redis 命令写入成功后,都会发送到一个缓冲区 aof_buf,redis 会读取缓冲 取,把命令 写入文件中
  • 文件写入和追加时间 ,什么时候会把 aof_buf 写入 aof 文件呢

在这里插入图片描述

什么是 aof 重写

aof 一直追加,时间久了文件 会很大,redis 为了优化这个问题,推出了 aof 重写

  • redis 会创建一个 新的文件,redis 数据库的数据,采用命令的方式,重新写入 aof 文件中,写完后,替换之前的 aof 文件
  • 这样合并去除了之前的多次 add del 命令,减少了容量
    在这里插入图片描述
aof 重写时,主线程有哪些地方会被阻塞
  • fork 子进程,需要复制虚拟页表
  • 有 bigkey 写入,需要 copy 一份副本
  • aof 写入完成,主进程 append aof buffer 数据时
    aof 怎么触发呢
  • 2 个配置
  • auto-aof-rewrite-min-size:表示运行AOF重写时文件的最小大小,默认为64MB。
  • auto-aof-rewrite-percentage:这个值的计算方式是,当前aof文件大小和上一次重写后aof文件大小的差值,再除以上一次重写后aof文件大小。也就是当前aof文件比上一次重写后aof文件的增量大小,和上一次重写后aof文件大小的比值。
aof 重写时,有新数据写入 怎么办?
  • 总结为 一个拷贝,2 出日志 , 在重新时,会 fork 子进程, 主进程会把命令 记录到 2 个 aof 缓冲区
  • bgrewriteaof 重新完成后 ,会通知主进程,主进程会把 aof 缓冲区命令追加到新的 aof 日志文件后面
  • 完成,采用重命名方式替换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全解析阿里云Alibaba Cloud Linux镜像操作系统

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版,针对阿里云服务器ECS做了大量深度优化,Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS,Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…

.NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法

在.NET 6中,微软官方建议把 System.Drawing.Common 迁移到 SkiaSharp 库。因为System.Drawing.Common 被设计为 Window 技术的精简包装器,因此其跨平台实现欠佳。 SkiaSharp是一个基于谷歌的Skia图形库(Skia.org)的用于.NET平台的…

目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段,如果我们想让预测值无限接近于真实值,就需要将损失值降到最低…

flink on yarn任务启停脚本(实现一键读取ck启动,保存ck停止)

1.问题描述 flink同步任务,长期任务过多,某个任务停止保存checkpoint或者savepoint后,修改代码,使用命令行读取检查点重新启动需要人工去hdfs上找寻检查点保存位置。任务过多管理起来很不方便。 鉴于此,使用脚本编写了…

kotlin基础——重载

重载算术运算符 重载二元算术运算 使用operator定义plus()方法后,可以直接使用号求和 data class Point(val x: Int, val y: Int) {operator fun plus(other: Point): Point {return Point(x other.x, y other.y)} } val p1 Point(1, 2) val p2 Point(3, 4) …

Spark三:Spark SQL

Spark SQL 数据的分析方式、数据分类和SparkSQL适用场景、数据抽象(DataFrame, DataSet, RDD),SparkSQL读取数据和处理数据的两种风格:SQL风格和DSL风格 学习链接 https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、数据分…

【GNN】经典GNN的数学原理之美

目录 引言 背景 图神经网络 节点 消息传递 聚合 更新 整合在一起 使用邻接矩阵 GNN层堆叠 以节点分类为例训练GNN。 训练和测试数据 1、Transductive 2、Inductive 反向传播和梯度下降 流行图神经网络总结 1、消息传递神经网络 2、图卷积 3、图注意力网络 …

旧硬盘插电脑上显示要初始化怎么办?了解原因和解决方案

在使用旧的硬盘插入电脑时,有时会遇到需要进行初始化的情况。这种情况可能是由于多种原因引起的,而初始化硬盘将会导致所有数据丢失,给用户造成不便和损失。因此,本文将介绍解决旧硬盘需要初始化的问题的方法,并提供一…

毕业设计:基于机器学习xgboost lgbm adaboost 的空气质量预测pm2.5‘, ‘so2‘, ‘no2‘ 完整代码数据-可直接运行

项目详细视频讲解介绍: 基于机器学习xgboost lgbm adaboost 的空气质量预测-完整代码数据可直接运行_哔哩哔哩_bilibili 数据展示: 运行结果展示: 项目代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split fr…

软件测试第二部分:白盒测试

概念与定义 白盒测试:侧重于系统或部件内部机制的测试,类型分为分支测试(判定节点测试)、路径测试、语句测试。 控制流分析(基于程序结构):控制流分析是一类用于分析程序控制流结构的静态分析技术,目的在于…

ModuleNotFoundError: No module named ‘numpy.testing.decorators‘

文章目录 报错信息报错原因解决方案 关注公众号:『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或➕v:codebiubiubiu滴滴我 报错信息 ModuleNotFoundError: No module named numpy.testing.decorators 报错原因 新版本已经去…

面试算法88:爬楼梯的最少成本

题目 一个数组cost的所有数字都是正数,它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本,在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。假设台阶至少有2级,既可以从第0级台阶出发,也可以从第1级台阶出发&#xff…

pip install 安装模块包位置及设置Anaconda为默认版本python

01问题 pycharm运行代码找不到模块包pip install不知道安装到哪里了jupyter使用不同版本python 02产生原因 安装了多个版本pythonanaconda本身也带有python 03解决办法 (1)查看当前默认python版本 打开运行窗口Winr; 输入cmd回车; 输入python回车…

初识Web服务器

一、web服务器 1、什么是web服务器? web服务器就是web项目的容器,我们将开发好的web项目部署到web容器中,才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用: 在我的电脑上有一个已经做好的项目&#…

linux centos 添加临时ip

### 1.添加ip ip addr add IP/mask dev 网络设备 例:ip addr add 172.104.210.247/24 dev ens5f1 ### 2.启动网卡 ip link set up 网络设备 例:ip link set up ens3f0 ### 3.设置默认路由 ip route add default via GATEWAY 例:ip route add …

python3ide手机安卓版下载,python3下载手机安卓版

大家好,给大家分享一下python3ide手机安卓版下载,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 大家好,给大家分享一下python3ide安卓版官网下载,很多人还不知道这一点。下面详细解释一下python编程代码…

C#编程-描述内存分配

描述内存分配 分配给变量的内存通过两种方式引用:值类型和引用类型。内置数据类型,诸如int、char和float都是值雷兴国。当您声明int变量时,编译器会分配一个内存块以保持该整数值。请思考以下语句: int Num 50;上述语句为保存值…

手机怎么边看视频边记笔记或备忘录?

在这个信息爆炸的时代,我们经常需要通过看培训视频、听网课来不断充实自己。但是,手机屏幕那么小,如何才能在做笔记的同时,又不错过视频的每一个细节呢? 以前,我总是为此头疼。一手拿着手机看视频&#xf…

电脑视频需要分屏怎么做

在当今数字时代,人们对于视频的需求越来越高。有时候,我们可能想在同一屏幕上同时播放多个视频,进行对比、观看、剪辑或者其他目的。那么,视频分屏应该怎么做呢? 在本篇文章中,我们将会详细的为你介绍视频分…