关于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.mfbz.cn/a/275500.html

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

相关文章

算法测试流程脚本工具站

🍉一、录入sql和批量上传minIo图片, 录入sql(掠过)..., 一个上传,一个下载,只需上传,找到 def upload():# NOTE:Step:3 把拉下来的图片传上去给XXX服务器的minioup_data_minio(&q…

用CHAT写环保为主题的校园实践活动报告

问CHAT:写一篇以环保为主题的校园实践活动报告 CHAT回复:尊敬的老师,亲爱的同学们: 大家好,今天我很荣幸地向大家分享一下,最近我们团队在学校里所组织的环保主题实践活动。 环保是一件至关重要的事情&am…

web自动化(4)——POM设计重构

1. 什么是POM Page Object Model 是ui自动化测试中常见的封装方式。 原理:将页面封装为PO对象,然后通过面向对象的方式实现UI自动化 2. 封装原则 PO无需包含全部UI元素PO应当验证元素PO不应该包含断言PO不应该暴露元素 3. 怎么进行POM封装 面向对象…

Leetcode 763 划分字母区间

题意理解: 要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 输入&#xff…

大数据与人工智能|信息技术产业架构、行业发展与前沿技术(第2节)

内容链接:信息技术产业架构、行业发展与前沿技术(大数据与人工智能系列课程 第2节) 声明:学习使用,侵权必删! 主要内容:1. 从算盘到量子计算机,介绍了半导体行业的发展历程和技术原…

二分查找——OJ题(一)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二分查找1、题目讲解2、算法原理3、代码实现 二、在排序数组中查找元素的第一个和最后一个…

【本地缓存篇】如何实现本地缓存?

如何实现本地缓存? ✔️典型解析✔️数据结构✔️线程安全✔️对象上限✔️清除策略✔️过期时间 ✔️扩展知识仓基于Caffeine实现本地缓存 ✔️典型解析 所谓本地缓存,就是和应用服务器在一起的缓存工具,将需要缓存的数据放到本地缓存中,可…

【轻松入门】OpenCV4.8 + QT5.x开发环境搭建

引言 大家好,今天给大家分享一下最新版本OpenCV4.8 QT5 如何一起配置,完成环境搭建的。 下载OpenCV4.8并解压缩 软件版本支持 CMake3.13 或者以上版本 https://cmake.org/ VS2017专业版或者以上版本 QT5.15.2 OpenCV4.8源码包 https://github.com/op…

常用的 linux 命令

常用的 linux 命令 1.从其他机器拷贝文件夹2.查看哪个程序在用特定端口3.实时监控日志文件内容4.查看指定用户拥有的进程5.查看磁盘空间使用情况6.文件搜索which(whereis) 显示系统命令所在目录find 查找任何文件或目录1) 根据文件名称查找2)…

【Linux驱动】Linux中断(一)—— 设备树中断节点

裸机使用中断需要通过寄存器手动配置,但有了 Linux 系统后,Linux内核提供了完善的中断框架,我们只需要申请中断,然后注册中断服务函数即可。 一、设备树中断属性 既然驱动中要注册中断服务函数,我们首先需要知道三个点…

实战 | 使用OpenCV快速去除文档中的表格线条(步骤 + 源码)

导 读 本文主要介绍如何使用OpenCV快速去除文档中的表格线条,并给详细步骤和代码。 背景介绍 测试图如下,目标是去除下面三张图中的表格线条,方便后续图像处理。 实现步骤 下面演示详细步骤,以图1为例: 【1】获取二值图像:加载图像、转为灰度图、OTSU二值化 i…

记录 | ubuntu源码编译python3.7.3(指定版本)

一、安装依赖包 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm sudo apt-get install -y libncurses5-dev libncursesw5-dev xz-utils tk-dev 二、从Python网…

mapboxgl 中给地图添加遮罩蒙版,并不遮罩其中一块区域

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章主要是给一整块地图添加遮罩层蒙版,但是不遮罩其中一个区域,以反向高亮地区内容。 效果预览 技术思路 这里要实现某个区域反显高亮,需要这个区域的边界json文件,与ech…

Flink1.17实战教程(第三篇:时间和窗口)

系列文章目录 Flink1.17实战教程(第一篇:概念、部署、架构) Flink1.17实战教程(第二篇:DataStream API) Flink1.17实战教程(第三篇:时间和窗口) Flink1.17实战教程&…

华锐三维云展平台创建VR文化宣传展厅,让文化传承变得更便捷和高效

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进人们的生活。通过华锐云展平台,可以通过拖、拉、拽,快速自由地创建一个VR文化宣传展厅,VR文化宣传展厅为人们提供了一个全新的、沉浸式的文化体验空间。在…

uniapp的分包使用记录

UniApp的分包是一种将应用代码划分为多个包的技术。分包的核心思想是将不同部分的代码划分为不同的包,按需加载,从而提高应用性能。使用UniApp的条件编译功能,开发人员可以根据需要将代码划分为多个包。每个包都包含一组页面和组件&#xff0…

在国内如何在Tiktok上买东西(在tiktok上付款)??

TikTok是一款由中国公司字节跳动(ByteDance)开发的社交媒体应用,于2016年9月正式上线。它在全球范围内迅速走红,特别受到年轻用户的喜爱。以下是关于TikTok的介绍以及其一些优势 支持的卡头有5561、531993 //点我办卡&#xff0c…

stm32H743编译器关于浮点类型强制转换传参的bug

局部函数,正常传参 当测试函数作为局部函数和main函数写在同一个文件中时,参数可以正常传递。函数参数和形参都为3.14 float value 0.0; void float_test(float _v) {value _v; }int main(void) {float_test(3.14f);while(1); } keil仿真截图&#…

关于MySQL、分布式系统、SpringCloud面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv MySQL 索引 说一下有哪些锁? 行锁有哪些? 性能优化 分库分表…

Java生态系统的进化:从JDK 1.0到今天

目录 前言 JDK 1.0:开启Java时代 JDK 1.1:Swing和内部类 JDK 1.2:Collections框架和JIT编译器 JDK 1.5:引入泛型和枚举 JDK 1.8:Lambda表达式和流 JDK 11以后:模块化和新特性 未来展望 总结 作者简…
最新文章