关于Redis面试题

前言

之前为了准备面试,收集整理了一些面试题。
本篇文章更新时间2023年12月27日。
最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv

Redis

是什么

全名:远程字典服务。这是一个开源的在内存中的数据结构存储系统,可以用作数据库、缓存、消息中间件

应用场景

在统计方面的场景

有哪些基本数据类型?

有哪些底层数据结构?

sorted set为什么使用跳表而不是平衡树?

首先,跳表实现起来比平衡树简单,插入、删除操作不需要进行平衡,所以性能也比平衡树好些;
其次,从空间效率的角度来看,跳表的索引占用的空间更加少一点,而平衡树还要在在每个节点维护平衡因子;
然后,还有就是并发度,跳表的插入、删除操作,只需要修改相邻节点的指针即可,平衡树还需要调整多个节点,所以,跳表可以支持更多的同时进行修改。

压缩列表的结构

由头部、数据中部、以及一个结尾符号组成。
头部内容包括 压缩列表大小、尾节点的偏移量、数据条目的个数。

谈谈redis的对象机制(redisObject)

redisObject是一个通用的基础结构,可以统一的表示各种数据类型,降低复杂度;
同时,配合共享内存池,可以复用redisObject对象,减少内存分配,避免构造对象的开销。

其中,它的结构主要由两大部分组成:元数据 + 数据的指针或实际数据值。

元数据就包括 数据类型type、底层树结构encoding、最后一次被访问时间lru,以及引用计数refcount。

处理问题思路导图

为什么要设计sds?

回答这个问题之前,先简单说明一下sds的数据结构,数据结构包括三个属性:记录空闲空间的free,记录当前内容长度的length、以及存储数据的buf数组。
image.png

数据结构有哪些

五种数据类型:string、list、sorted set、set、hash
其它数据结构:HyperLogLog、Geo、、Push/sub
其它的还有Redis Moudle、BloomFilter等

单线程还是多线程

Redis6.0+
读写还是单线程(主线程),处理网络请求、结果回写用多线程处理(IO线程并行处理,处理期间主线程阻塞)。

聊聊持久化机制

RDB+AOF

说一下 Copy On Write 技术

多个线程共享内存资源,当发生修改的时候,就复制一份出来。

Redis在使用RDB进行持久化的时候,会fork一个子线程执行持久化工作,子线程跟主线程共享内存,子线程遍历读取数据写入到磁盘,如果数据发生改动,主线程会先复制一份再修改。

缓存淘汰策略

细分的话有8种。
根据情况大体可以分为两类,一类是针对过期的key,另一类是内存满的时候触发。
更具体一点的话,就有随机淘汰、最近最久未使用的、最近最少使用、比较早过期的

MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如 何保证 redis 中的数据都是热点数据?

核心思想是LRU:最近最少使用。
将非热点数据淘汰掉。
具体的策略包括针对过期的key进行被动淘汰的策略、以及主动进行缓存淘汰的策略。

假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以 某个固定的已知的前缀开头的,如果将它们全部找出来?

scan指令

如何应对Redis变慢

预防:避免单线阻塞操作
image.png

  • 大key操作、释放大量内存、聚合计算等
  • 生成快照、AOF刷盘
  • 集群之间传输、加载快照
  • 数据迁移

硬件:CPU结构对性能的影响
观察上下文切换情况:绑核减少切换次数。
在一些处理器架构下,考虑把网络中断程序核Redis主线程绑在一个CPU:避免远端内存访问
注意避免主线程跟子线程竞争CPU。
是否真的变慢了?
使用redis-cli --latency -h host -p port指令查看最大延迟。
真的慢了!重点三个方面入手

  • 自身特性:注意指令的一个时间复杂度、避免大面积key过期
  • 文件系统:避免虚拟内存交换
  • 操作系统:可以考虑关闭内存大页,避免修改10b数据就要拷贝2M内存也的情况

Redis事务的三个阶段

开启事务、加入命令、执行事务

Redis为什么不支持回滚

从设计层面来看,这个可以让redis更简单快速;
对于开发者来说,语法错误的问题应该在开发中就要发现,而不是在生产环境发生。

Redis key 的过期时间和永久有效分别怎么设置?

默认过期。
如果设置了过期时间,想要设置为永久,可以使用PERSIST命令。

主从库网络断开了怎么办?

从库发送同步(psync)命令给主库,主库会对照当前offset,判断进行全量同步还是增量同步。

Redis 1主4从,5个哨兵,哨兵配置quorum为2,如果3个哨兵故障,当主库宕机时,哨兵能否判断主库“客观下线”?能否自动切换?

能判定客观下线,但是不能进行自动切换。

说说Redis哈希槽的概念?

随着数据量的增加,我们进行一些阻塞主线程的一些操作的时候,操作带来的影响就会越来越明显,比如RDB持久化操作,所以,这时候我们可能需要进行扩展,对数据进行切片,将数据分散到不同的实例上,在这方面,官方提供了redis cluster方案。
redis cluster采用了哈希槽,处理数据和实例之间的映射关系。
客户端在跟集群建立连接的时候,会拿到槽的分配信息,通过计算key映射到那个槽,来定位要发送的实例。
image.png
image.png

为什么是16384个?

设计这从两个方面回答了这个问题:

  1. 降低消息大小:一万六千多个槽,心跳包大小为2K,相比与6万多的槽,小很多,可以节省带宽。
  2. 集群规模设计考虑:集群最多支持1000个分片,假如1万六千个槽在分配均匀的情况下,分片平均分到的槽不至于太小。

Redis集群会有写操作丢失吗?为什么?

会丢失,Redis不保证强一致性。

redis实现分布式锁实现?RedLock?

SETNX:key不存在时设置key,成功则返回1。
RedLock:想集群多个节点请求获取锁,当半数节点成功获取到锁时,才算获取锁成功。

redis缓存有哪些问题,如何解决?

redis和其它数据库一致性问题如何解决?

主从数据不一致问题?

问题:主库修改了key,从库没有及时更新。

原因:由于网络延迟、从库在执行高复杂命令等。

处理:外部程序监控复制进度、保证网络通常。

主从模式下在从库读到过期数据

升级版本、设置一个过期时间为一个具体的时间点。

缓存问题:雪崩、击穿、穿透

数据量倾斜问题

原因分析

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、C++简介

C语言的发展史 1983年,贝尔实验室(Bell Labs)的Bjarne Stroustrup发明了C。 C在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言。 Stroustrup说:“这个名字象征着源自于C语言变…

模式识别与机器学习-SVM(线性支持向量机)

线性支持向量机 线性支持向量机间隔距离学习的对偶算法算法:线性可分支持向量机学习算法线性可分支持向量机例子 谨以此博客作为复习期间的记录 线性支持向量机 在以上四条线中,都可以作为分割平面,误差率也都为0。但是那个分割平面效果更好呢&#xff1…

Postman常见问题及解决方法

1、网络连接问题 如果Postman无法发送请求或接收响应,可以尝试以下操作: 检查网络连接是否正常,包括检查网络设置、代理设置等。 确认请求的URL是否正确,并检查是否使用了正确的HTTP方法(例如GET、POST、PUT等&#…

Linux操作系统——进程(六) 进程地址空间

进程地址空间 C/C程序员一般将我们所写的程序看成如下这种结构: 我们所写的程序通过编译编译之后就可以以这样的方式进行分布. 我们先通过编写一段C语言代码来进行验证: 运行结果: 我们可以看出来上述地址遵循的就是我们上面画的一种结构。…

H5向微信小程序发送信息(小程序web-view打开H5)

引入weixin-js-sdk npm i weixin-js-sdk 页面引入 // 引入wxjsimport wx from "weixin-js-sdk"; 点击触发方法 methods: {goweap(id){console.log(wx);// H5传递数据 (navigateBack)wx.miniProgram.navigateBack({delta: 1});wx.min…

探究element-ui 2.15.8中<el-input>的keydown事件无效问题

一、问题描述 今天看到一个问题&#xff0c;在用Vue2element-ui 2.15.8开发时&#xff0c;使用input组件绑定keydown事件没有任何效果。 <template><div id"app"><el-input v-model"content" placeholder"请输入" keydown&quo…

播放海康摄像头直播流使用笔记

1、将海康摄像头绑定到萤石云平台&#xff0c;并查看直播流 2、项目中使用 1、安装hls cnpm i hls.js 2、封装组件&#xff08;在components文件夹下新建bodyCapture文件夹下index.vue&#xff09; <template><el-dialogtitle"遗体抓拍"class"bo…

gin框架使用系列之六——自定义中间件

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》《gin框架使用系列之五——表单校验》 一、gin中间件概述 gin中将…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…

Java在SpringCloud中自定义Gateway负载均衡策略

Java在SpringCloud中自定义Gateway负载均衡策略 一、前言 spring-cloud-starter-netflix-ribbon已经不再更新了&#xff0c;最新版本是2.2.10.RELEASE&#xff0c;最后更新时间是2021年11月18日&#xff0c;详细信息可以看maven官方仓库&#xff1a;org.springframework.clou…

vue3+elementPlus:el-drawer新增修改弹窗复用

在el-drawer的属性里设置:title属性&#xff0c;和重置函数 //html<!-- 弹窗 --><el-drawerv-model"drawer":title"title":size"505":direction"direction":before-close"handleClose"><el-formlabel-posit…

linux如何清理磁盘,使得数据难以恢复

sda 是硬盘&#xff0c;sda1 和 sda2 是硬盘的两个分区。centos-root 是一个逻辑卷&#xff0c;挂载在根目录 /。 /dev/sda 是硬盘&#xff0c;/dev/sda1 和 /dev/sda2 是硬盘的两个分区。 [rootnode2 ~]# dd if/dev/urandom of/dev/sda bs4M这个命令将从 /dev/urandom 读取随…

WPF实战项目二十二(客户端):首页添加备忘录与待办事项

1、在View文件夹下新建文件夹Dialog&#xff0c;新建View&#xff1a;AddMemoView、AddToDoView <UserControlx:Class"WPFProject.Views.Dialogs.AddToDoView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://s…

Pandas教程(三)—— 数据清洗与准备

1.处理缺失值 1.1 数据删除函数 作用&#xff1a;删除Dataframe某行或某列的数据 语法&#xff1a;df.drop&#xff08; labels [ ] &#xff09; drop函数的几个参数&#xff1a; labels &#xff1a;接收一个列表&#xff0c;内含删除行 / 列的索引编号或索引名 axis &…

20231222给NanoPC-T4(RK3399)开发板的适配原厂Android10的挖掘机方案并跑通AP6398SV

20231222给NanoPC-T4(RK3399)开发板的适配原厂Android10的挖掘机方案并跑通AP6398SV 1、简略步骤&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/3399-android10$ cat Rockchip_Android10.0_SDK_Release.tar.gz0* > Rockchip_Android10.0_SDK_Release.tar.gz rootrootrootro…

python pip安装依赖的常用软件源

目录 引言 一、什么是镜像源&#xff1f;​​​​​​​ 二、清华源 三、阿里源 四、中科大源 五、豆瓣源 六、更多资源 引言 在软件开发和使用过程中&#xff0c;我们经常需要下载和更新各种软件包和库文件。然而&#xff0c;由于网络环境的限制或者服务器的负载&#…

Vue3中说说Tree shaking特性?举例说明一下?

提起Vue3里面的Tree shaking时候&#xff0c;需要提到它是通过构建工具和模块导入方式实现的。然后我们再说说Tree shaking是什么和作用 一、通过构建工具和模块导入方式实现 1.配置构建工具&#xff1a; 在 Vue 3 项目中&#xff0c;通常使用 webpack 进行构建。为了启用 T…

百度CTO王海峰:文心一言用户规模破1亿

▶ 写在前面▶ 飞桨开发者已达1070万▶ 文心一言用户规模破亿&#xff0c;日提问量快速增长 ▶ 写在前面 “文心一言用户规模突破 1 亿。”12 月 28日&#xff0c;百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届 WAVE SUMMIT 深度学习开发者大会上宣布…

数据结构--查找

目录 1. 查找的基本概念 2. 线性表的查找 3. 树表的查找 3.1 二叉排序树 3.1.1 定义: 3.1.2 存储结构&#xff1a; 3.1.3 二叉排序树的查找 3.1.4 二叉排序树的插入 3.1.5 二叉排序树删除 3.2 平衡二叉树&#xff08;AVL 3.2.1 为什么要有平衡二叉树 3.2.2 定义 3.3 B-树 3.3.1…

【《设计模式之美》】如何取舍继承与组合

文章目录 什么情况下不推荐使用继承&#xff1f;组合相比继承有哪些优势&#xff1f;使用组合、继承的时机 本文主要想了解&#xff1a; 为什么组合优于继承&#xff0c;多用组合少用继承。如何使用组合来替代继承哪些情况适用继承、组合。有哪些设计模式使用到了继承、组合。 …