Redis相关面试
以下是一些在面试中关于 Redis 最常被问到的问题,涵盖了 Redis 的基础概念、数据结构、持久化、主从复制、哨兵、集群、应用场景以及常见的缓存问题等。可以根据自身实际项目经验,结合下面的要点进行深入讲解。
1. Redis 基础与特点
-
Redis 是什么?与 Memcached 相比有什么优点?
- Redis 是一个基于内存的高性能键值对(Key-Value)数据库;
- 支持多种数据结构(String、List、Hash、Set、ZSet 等),功能比 Memcached 更丰富;
- 提供持久化、发布订阅、Lua 脚本、事务等特性;
- 官方性能测试可达 10 万级 QPS。
-
Redis 有哪些常见应用场景?
- 缓存热点数据,降低数据库访问压力;
- 分布式锁;
- 排行榜、计数器;
- 消息队列(基于 List 实现)或发布/订阅系统;
- 会话缓存、购物车缓存等;
- Geo/GIS 场景(从 3.2 开始支持)。
-
Redis 和数据库之间数据一致性如何保证?
- 一般是最终一致性,在高并发场景下难以做到强一致;
- 常用策略:失效时回源 DB、定期更新/失效、分布式事务协调等。
- 面试中可以谈自己的业务实际处理方式,比如双写、延迟双删策略等。
2. Redis 数据类型与用法
-
Redis 有哪些常见数据类型?对应的使用场景是什么?
- String:最常用的数据结构,常作为缓存、计数器(incr、decr)。
- Hash:存储对象的属性信息,节省内存(类似于小型数据库表)。
- List:常用作队列、消息队列,Lpush/Rpop 实现先进后出。
- Set:去重、交集并集等集合运算,常用于共同好友、共同关注等。
- Sorted Set(ZSet):在 Set 的基础上增加了分数排序,可做排行榜、优先级队列。
-
Redis 过期键删除策略有哪些?
- 定期删除:默认每隔 100ms 随机抽取一些设置了过期时间的 key,检查并删除过期键。
- 惰性删除:在访问 key 时,如果发现过期则删除并返回空。
- 需要注意过期键太多时可能造成过期浪涌等性能问题,需要做好参数调优和限流。
3. Redis 持久化机制
-
Redis 提供了哪些持久化方式?
- RDB(Redis DataBase):将内存数据在某个时间点生成快照,保存在磁盘上;
- AOF(Append Only File):以追加的方式记录服务器执行的写命令日志。
-
RDB 和 AOF 的区别?各自的优缺点?
- RDB:
- 优点:适合做备份、恢复;文件小;对性能影响较小;
- 缺点:可能丢失最后一次快照之后的数据。
- AOF:
- 优点:数据安全,丢数据风险更低;
- 缺点:文件体积比 RDB 大,恢复速度相对慢,对性能有一定影响。
- RDB:
-
Redis 怎么做数据恢复?
- 先看有无可用的 AOF 文件,用 AOF 文件恢复更安全;
- 如无 AOF 或 AOF 不可用,则使用最新的 RDB 文件恢复;
- AOF 重写:在文件过大时会触发重写,生成新的 AOF 文件,以避免过大的日志文件影响性能。
4. Redis 主从复制与高可用
-
Redis 主从复制原理?
- 从库启动时向主库发送
PSYNC
命令; - 主库会在内存生成 RDB 并发送给从库,同步完成后再将新操作的命令流继续发送给从库;
- 实现数据的最终一致。
- 从库启动时向主库发送
-
Redis 哨兵(Sentinel)机制?
- 哨兵是一个独立进程,用于监控 Redis 实例的运行状态;
- 发现主库宕机后,哨兵会自动在从库中选举新的主库并完成主从切换;
- 在高可用架构中,哨兵一般与 Redis 实例一同部署,通过投票机制实现自动故障转移(Failover)。
- Redis Cluster 集群模式?
- 将数据分片存储到多个节点,每个节点对应一部分哈希槽(hash slot),共 16384 个槽;
- 节点之间互相通讯,通过 Gossip 协议交换元数据信息,自动发现和故障转移;
- 避免了单点瓶颈,提供了更高的扩展性和可用性。
- Redis Cluster 如何实现数据分片?
- 使用一致性哈希的思想,将 key 的 CRC16 校验值对 16384 取模,得到对应槽位,映射到指定节点;
- 每个节点负责一部分槽位区间。
5. Redis 性能与并发
- Redis 的单线程模型为什么依然很快?
- 核心数据结构操作都是在内存中进行;
- 使用 I/O 多路复用,非阻塞事件驱动;
- 单线程避免了线程切换和加锁开销。
- Redis 如何在并发场景下使用?会不会阻塞?
- 虽然 Redis 核心处理命令是单线程,但网络 I/O 在多路复用的管理下可并行处理连接;
- 整个命令执行队列是串行的,极大地简化了并发访问时的锁冲突问题;
- 当命令执行耗时过长(如大操作)确实会阻塞后续命令,需要对大操作进行拆分。
- Redis Pipeline(管道)机制是什么?
- 一次性发送多条命令到服务器,减少网络往返,提高吞吐量;
- 虽然减少了 RTT(网络延迟),但不改变命令的实际执行顺序,也不保证原子性。
6. 分布式锁与其他高级特性
- Redis 分布式锁如何实现?
- 最简单的方式:
SET key value NX EX <expireTime>
,当返回OK
时代表获取到锁; - 释放锁时,需要先判断 value 是否与自身匹配;
- 可能出现锁失效或非原子化操作问题,官方提供了 Redlock 算法来增强可靠性。
- Redis 事务和 Lua 脚本
- 事务:通过
MULTI
、EXEC
、WATCH
等命令实现,MULTI
命令之后所有命令会被放入队列,直到EXEC
时一次性执行; - Lua 脚本:将逻辑打包成脚本在服务端原子执行,减少网络开销,并保证脚本执行的原子性。
- Redis 发布/订阅(Pub/Sub)如何使用?
- 通过
PUBLISH
、SUBSCRIBE
命令实现消息广播; - 适合实时消息推送,不适合数据落盘(消息持久化),消息丢失后无法恢复。
7. 常见的缓存问题
- 什么是缓存穿透、缓存击穿、缓存雪崩?怎么解决?
- 缓存穿透:访问大量不存在的数据,每次都会绕过缓存查询数据库。
- 解决方案:布隆过滤器、空值缓存。
- 缓存击穿:热点 key 在某个时间点失效,大量请求直击后端数据库。
- 解决方案:设置互斥锁或提前续期热点 key。
- 缓存雪崩:大面积 key 同一时间失效,导致系统压力骤增。
- 解决方案:随机过期时间、分散过期;多级缓存;限流、降级措施。
- Redis 的淘汰策略有哪些?
- noeviction:禁止驱逐,内存满了直接报错;
- allkeys-lru:对所有键使用 LRU 算法进行淘汰;
- allkeys-random:对所有键随机淘汰;
- volatile-lru:只对设置了过期时间的键使用 LRU 淘汰;
- volatile-random:只对设置了过期时间的键随机淘汰;
- volatile-ttl:优先淘汰剩余生存时间(TTL)最短的键。
8. 其他常见问题
- Redis 的内存模型和内存管理
- 底层采用自定义内存分配器或 libc 分配器;
- 可以配置
maxmemory
,超过后按配置的淘汰策略进行移除; - 注意不同数据类型对内存的占用方式,比如 Hash 可以使用 ziplist(压缩列表)优化小数据量占用空间。
- Redis 热点 Key 如何优化?
- 采用拆分:对特定热点 key 进行分片;
- 通过本地缓存或多级缓存方式降低访问量;
- 考虑使用队列、限流、锁等手段削峰。
- 如何监控 Redis ?
- Redis 提供
INFO
命令可查看内存、连接、流量、持久化等指标; - 也可通过第三方监控系统(Prometheus + Grafana)或官方 Redis-Monitor 工具;
- 监控命令响应时间、CPU、内存、带宽、连接数以及主从、哨兵状态等。
- 如何进行 Redis 的性能压测?
- 使用官方提供的
redis-benchmark
工具; - 或在实际项目中以压测工具(JMeter、LoadRunner 等)模拟真实场景;
- 主要观察 QPS、响应时间、命令耗时分布等。
总结
Redis 的面试题通常围绕原理、数据结构、持久化、主从复制/集群、缓存问题以及实际应用场景展开。面试中除了掌握理论知识点外,还需结合自身项目的实践案例,比如:
- 在什么场景下用 Redis 做缓存,如何设计过期策略;
- 如何处理缓存和数据库数据一致性问题;
- 如何在高并发下保证 Redis 的稳定和高可用;
- 如何优化大数据量操作等。
有针对性地根据面试岗位需求(如高可用、分布式锁、消息系统等方面)进行重点准备,可以在面试中更好地展现自己的能力与经验。祝面试顺利!
相关文章:
Redis相关面试
以下是一些在面试中关于 Redis 最常被问到的问题,涵盖了 Redis 的基础概念、数据结构、持久化、主从复制、哨兵、集群、应用场景以及常见的缓存问题等。可以根据自身实际项目经验,结合下面的要点进行深入讲解。 1. Redis 基础与特点 Redis 是什么&#x…...

使用强化学习训练神经网络玩俄罗斯方块
一、说明 在 2024 年暑假假期期间,Tim学习并应用了Q-Learning (一种强化学习形式)来训练神经网络玩简化版的俄罗斯方块游戏。在本文中,我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…...

java中的日期处理:只显示日期,不显示时间的两种处理方式
需要记录某个操作的操作时间,数据库中该字段为DATE类型; 插入数据的时候,使用数据库函数NOW()获取当前日期并插入: <insert id"batchInsertOrgTestersByProjectId">insert into project_org_testers(project_un…...
腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
作品介绍 贪吃蛇小游戏需要控制蛇的移动方向,使其吃掉地图上随机出现的食物,每吃掉一个食物,蛇的身体就会增长一格,是一款老少皆宜的小游戏,我们可以用腾讯ai助手生成全部代码,简单方便快捷。 技术架构 …...
水水水水水
为了拿推广卷,但不想把我原本完整的文章拆成零散的多篇,只能出此下策随便发一篇,认真写的都笔记专栏里 5G与未来网络 5G技术一直是近几年讨论的热点。它不仅仅是提升手机上网速度,更是对万物互联(IoT)的一次…...
Spring整合SpringMVC
目录 【pom.xml】文件; 新建【applicationContext.xml】文件 新建【springmvc.xml】文件; 配置【src/main/webapp/WEB-INF/web.xml】文件; 新建【com.gupaoedu.service.IUserService】; 新建【com.gupaoedu.service.impl.Use…...

【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 说句题外话,写这篇的时间比写所有权还还花的久,trait是真的比较难理解的概念。 10.4.1. 把trait作为参数 继续以…...

嵌入式系统 (2.嵌入式硬件系统基础)
2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构:前者指令和数据共享同一存储空间…...
Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)
导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …...

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性
本文作者: 容器服务团队:刘佳旭、冯诗淳 可观测团队:竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准(CNCF Survey[1])。随着承接的业务规模越来越大,用户也在使…...

安卓触摸对焦
1. 相机坐标说明 触摸对焦需要通过setFocusAreas()设置对焦区域,而该方法的参数的坐标,与屏幕坐标并不相同,需要做一个转换。 对Camera(旧版相机API)来说,相机的坐标区域是一个2000*2000,原点…...

jupyter出现“.ipynb appears to have died. It will restart automatically.”解决方法
原因 解决方法:更新jupyter的版本 1.打开anaconda prompt 2、更新jupyter版本 在anaconda prompt输入以下指令 conda update jupyter如图:...
20250108-实验+神经网络
实验3. 神经网络与反向传播算法 3.1 计算图:复合函数的计算图 实验要求1:基于numpy实现 ( y 1 , y 2 ) f ( x 1 , x 2 , x 3 ) (y_1,y_2) f(x_1,x_2,x_3) (y1,y2)f(x1,x2,x3) 的反向传播算法(不允许使用自动微分)&a…...
【权限管理】CAS(Central Authentication Service)
CAS(Central Authentication Service)是一种广泛应用的 单点登录(SSO) 协议,它允许用户在一个集中式的身份验证系统中登录一次后,便可以无缝访问多个应用系统,而无需重复登录。CAS 通过统一的身…...

Golang笔记:使用net包进行TCP监听回环测试
文章目录 前言TCP监听回环代码演示 附:UDP监听回环 前言 TCP是比较基础常用的网络通讯方式,这篇文章将使用Go语言实现TCP监听回环测试。 本文中使用 Packet Sender 工具进行测试,其官网地址如下: https://packetsender.com/ TC…...

《浮岛风云》V1.0中文学习版
《浮岛风云》中文版https://pan.xunlei.com/s/VODadt0vSGdbrVOBEsW9Xx8iA1?pwdy7c3# 一款有着类似暗黑破坏神的战斗系统、类似最终幻想的奇幻世界和100%可破坏体素环境的动作冒险RPG。...

Day10——爬虫
爬虫概念 网络请求 爬虫分类 基本流程 请求头...
10. C语言 函数详解
本章目录: 前言1. C 语言函数概述1.1 函数的定义与结构1.2 函数声明1.3 函数调用 2. 函数参数传递2.1 传值调用2.2 传引用调用(模拟)2.3 引用调用(C 特性) 3. 内部函数与外部函数3.1 内部函数3.2 外部函数3.3 示例:多个…...

NRC优先级中比较特殊的—NRC0x13和NRC0x31
1、基础知识 大家都了解 NRC0x13,表示长度错误和格式错误 NRC0x31,表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分: 2.1、先看NRC0x13 步骤一:仔细看是先判断Minmun Length Check ࿰…...
ref() 和 reactive() 区别
ref() 和 reactive() 都是 Vue 3 中用于创建响应式数据的方法,但它们之间存在一些关键差异。 首先,ref() 用于创建响应式的标量值,比如数字、字符串、布尔值等基本数据类型,以及对象和数组等复杂数据类型。当你使用 ref() 时&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...