当前位置: 首页 > news >正文

Redis相关面试

以下是一些在面试中关于 Redis 最常被问到的问题,涵盖了 Redis 的基础概念、数据结构、持久化、主从复制、哨兵、集群、应用场景以及常见的缓存问题等。可以根据自身实际项目经验,结合下面的要点进行深入讲解。


1. Redis 基础与特点

  1. Redis 是什么?与 Memcached 相比有什么优点?

    • Redis 是一个基于内存的高性能键值对(Key-Value)数据库;
    • 支持多种数据结构(String、List、Hash、Set、ZSet 等),功能比 Memcached 更丰富;
    • 提供持久化、发布订阅、Lua 脚本、事务等特性;
    • 官方性能测试可达 10 万级 QPS。
  2. Redis 有哪些常见应用场景?

    • 缓存热点数据,降低数据库访问压力;
    • 分布式锁;
    • 排行榜、计数器;
    • 消息队列(基于 List 实现)或发布/订阅系统;
    • 会话缓存、购物车缓存等;
    • Geo/GIS 场景(从 3.2 开始支持)。
  3. Redis 和数据库之间数据一致性如何保证?

    • 一般是最终一致性,在高并发场景下难以做到强一致;
    • 常用策略:失效时回源 DB、定期更新/失效、分布式事务协调等。
    • 面试中可以谈自己的业务实际处理方式,比如双写、延迟双删策略等。

2. Redis 数据类型与用法

  1. Redis 有哪些常见数据类型?对应的使用场景是什么?

    • String:最常用的数据结构,常作为缓存、计数器(incr、decr)。
    • Hash:存储对象的属性信息,节省内存(类似于小型数据库表)。
    • List:常用作队列、消息队列,Lpush/Rpop 实现先进后出。
    • Set:去重、交集并集等集合运算,常用于共同好友、共同关注等。
    • Sorted Set(ZSet):在 Set 的基础上增加了分数排序,可做排行榜、优先级队列。
  2. Redis 过期键删除策略有哪些?

    • 定期删除:默认每隔 100ms 随机抽取一些设置了过期时间的 key,检查并删除过期键。
    • 惰性删除:在访问 key 时,如果发现过期则删除并返回空。
    • 需要注意过期键太多时可能造成过期浪涌等性能问题,需要做好参数调优和限流。

3. Redis 持久化机制

  1. Redis 提供了哪些持久化方式?

    • RDB(Redis DataBase):将内存数据在某个时间点生成快照,保存在磁盘上;
    • AOF(Append Only File):以追加的方式记录服务器执行的写命令日志。
  2. RDB 和 AOF 的区别?各自的优缺点?

    • RDB
      • 优点:适合做备份、恢复;文件小;对性能影响较小;
      • 缺点:可能丢失最后一次快照之后的数据。
    • AOF
      • 优点:数据安全,丢数据风险更低;
      • 缺点:文件体积比 RDB 大,恢复速度相对慢,对性能有一定影响。
  3. Redis 怎么做数据恢复?

    • 先看有无可用的 AOF 文件,用 AOF 文件恢复更安全;
    • 如无 AOF 或 AOF 不可用,则使用最新的 RDB 文件恢复;
    • AOF 重写:在文件过大时会触发重写,生成新的 AOF 文件,以避免过大的日志文件影响性能。

4. Redis 主从复制与高可用

  1. Redis 主从复制原理?

    • 从库启动时向主库发送 PSYNC 命令;
    • 主库会在内存生成 RDB 并发送给从库,同步完成后再将新操作的命令流继续发送给从库;
    • 实现数据的最终一致。
  2. Redis 哨兵(Sentinel)机制?

  • 哨兵是一个独立进程,用于监控 Redis 实例的运行状态;
  • 发现主库宕机后,哨兵会自动在从库中选举新的主库并完成主从切换;
  • 在高可用架构中,哨兵一般与 Redis 实例一同部署,通过投票机制实现自动故障转移(Failover)。
  1. Redis Cluster 集群模式?
  • 将数据分片存储到多个节点,每个节点对应一部分哈希槽(hash slot),共 16384 个槽;
  • 节点之间互相通讯,通过 Gossip 协议交换元数据信息,自动发现和故障转移;
  • 避免了单点瓶颈,提供了更高的扩展性和可用性。
  1. Redis Cluster 如何实现数据分片?
  • 使用一致性哈希的思想,将 key 的 CRC16 校验值对 16384 取模,得到对应槽位,映射到指定节点;
  • 每个节点负责一部分槽位区间。

5. Redis 性能与并发

  1. Redis 的单线程模型为什么依然很快?
  • 核心数据结构操作都是在内存中进行;
  • 使用 I/O 多路复用,非阻塞事件驱动;
  • 单线程避免了线程切换和加锁开销。
  1. Redis 如何在并发场景下使用?会不会阻塞?
  • 虽然 Redis 核心处理命令是单线程,但网络 I/O 在多路复用的管理下可并行处理连接;
  • 整个命令执行队列是串行的,极大地简化了并发访问时的锁冲突问题;
  • 当命令执行耗时过长(如大操作)确实会阻塞后续命令,需要对大操作进行拆分。
  1. Redis Pipeline(管道)机制是什么?
  • 一次性发送多条命令到服务器,减少网络往返,提高吞吐量;
  • 虽然减少了 RTT(网络延迟),但不改变命令的实际执行顺序,也不保证原子性。

6. 分布式锁与其他高级特性

  1. Redis 分布式锁如何实现?
  • 最简单的方式:SET key value NX EX <expireTime>,当返回 OK 时代表获取到锁;
  • 释放锁时,需要先判断 value 是否与自身匹配;
  • 可能出现锁失效或非原子化操作问题,官方提供了 Redlock 算法来增强可靠性。
  1. Redis 事务和 Lua 脚本
  • 事务:通过 MULTIEXECWATCH 等命令实现,MULTI 命令之后所有命令会被放入队列,直到 EXEC 时一次性执行;
  • Lua 脚本:将逻辑打包成脚本在服务端原子执行,减少网络开销,并保证脚本执行的原子性。
  1. Redis 发布/订阅(Pub/Sub)如何使用?
  • 通过 PUBLISHSUBSCRIBE 命令实现消息广播;
  • 适合实时消息推送,不适合数据落盘(消息持久化),消息丢失后无法恢复。

7. 常见的缓存问题

  1. 什么是缓存穿透、缓存击穿、缓存雪崩?怎么解决?
  • 缓存穿透:访问大量不存在的数据,每次都会绕过缓存查询数据库。
    • 解决方案:布隆过滤器、空值缓存。
  • 缓存击穿:热点 key 在某个时间点失效,大量请求直击后端数据库。
    • 解决方案:设置互斥锁或提前续期热点 key。
  • 缓存雪崩:大面积 key 同一时间失效,导致系统压力骤增。
    • 解决方案:随机过期时间、分散过期;多级缓存;限流、降级措施。
  1. Redis 的淘汰策略有哪些?
  • noeviction:禁止驱逐,内存满了直接报错;
  • allkeys-lru:对所有键使用 LRU 算法进行淘汰;
  • allkeys-random:对所有键随机淘汰;
  • volatile-lru:只对设置了过期时间的键使用 LRU 淘汰;
  • volatile-random:只对设置了过期时间的键随机淘汰;
  • volatile-ttl:优先淘汰剩余生存时间(TTL)最短的键。

8. 其他常见问题

  1. Redis 的内存模型和内存管理
  • 底层采用自定义内存分配器或 libc 分配器;
  • 可以配置 maxmemory,超过后按配置的淘汰策略进行移除;
  • 注意不同数据类型对内存的占用方式,比如 Hash 可以使用 ziplist(压缩列表)优化小数据量占用空间。
  1. Redis 热点 Key 如何优化?
  • 采用拆分:对特定热点 key 进行分片;
  • 通过本地缓存多级缓存方式降低访问量;
  • 考虑使用队列、限流、锁等手段削峰。
  1. 如何监控 Redis ?
  • Redis 提供 INFO 命令可查看内存、连接、流量、持久化等指标;
  • 也可通过第三方监控系统(Prometheus + Grafana)或官方 Redis-Monitor 工具;
  • 监控命令响应时间、CPU、内存、带宽、连接数以及主从、哨兵状态等。
  1. 如何进行 Redis 的性能压测?
  • 使用官方提供的 redis-benchmark 工具;
  • 或在实际项目中以压测工具(JMeter、LoadRunner 等)模拟真实场景;
  • 主要观察 QPS、响应时间、命令耗时分布等。

总结

Redis 的面试题通常围绕原理、数据结构、持久化、主从复制/集群、缓存问题以及实际应用场景展开。面试中除了掌握理论知识点外,还需结合自身项目的实践案例,比如:

  • 在什么场景下用 Redis 做缓存,如何设计过期策略;
  • 如何处理缓存和数据库数据一致性问题;
  • 如何在高并发下保证 Redis 的稳定和高可用;
  • 如何优化大数据量操作等。

有针对性地根据面试岗位需求(如高可用、分布式锁、消息系统等方面)进行重点准备,可以在面试中更好地展现自己的能力与经验。祝面试顺利!

相关文章:

Redis相关面试

以下是一些在面试中关于 Redis 最常被问到的问题&#xff0c;涵盖了 Redis 的基础概念、数据结构、持久化、主从复制、哨兵、集群、应用场景以及常见的缓存问题等。可以根据自身实际项目经验&#xff0c;结合下面的要点进行深入讲解。 1. Redis 基础与特点 Redis 是什么&#x…...

使用强化学习训练神经网络玩俄罗斯方块

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

java中的日期处理:只显示日期,不显示时间的两种处理方式

需要记录某个操作的操作时间&#xff0c;数据库中该字段为DATE类型&#xff1b; 插入数据的时候&#xff0c;使用数据库函数NOW()获取当前日期并插入&#xff1a; <insert id"batchInsertOrgTestersByProjectId">insert into project_org_testers(project_un…...

腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏

作品介绍 贪吃蛇小游戏需要控制蛇的移动方向&#xff0c;使其吃掉地图上随机出现的食物&#xff0c;每吃掉一个食物&#xff0c;蛇的身体就会增长一格&#xff0c;是一款老少皆宜的小游戏&#xff0c;我们可以用腾讯ai助手生成全部代码&#xff0c;简单方便快捷。 技术架构 …...

水水水水水

为了拿推广卷&#xff0c;但不想把我原本完整的文章拆成零散的多篇&#xff0c;只能出此下策随便发一篇&#xff0c;认真写的都笔记专栏里 5G与未来网络 5G技术一直是近几年讨论的热点。它不仅仅是提升手机上网速度&#xff0c;更是对万物互联&#xff08;IoT&#xff09;的一次…...

Spring整合SpringMVC

目录 【pom.xml】文件&#xff1b; 新建【applicationContext.xml】文件 新建【springmvc.xml】文件&#xff1b; 配置【src/main/webapp/WEB-INF/web.xml】文件&#xff1b; 新建【com.gupaoedu.service.IUserService】&#xff1b; 新建【com.gupaoedu.service.impl.Use…...

【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;写这篇的时间比写所有权还还花的久&#xff0c;trait是真的比较难理解的概念。 10.4.1. 把trait作为参数 继续以…...

嵌入式系统 (2.嵌入式硬件系统基础)

2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心&#xff0c;主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构&#xff1a;前者指令和数据共享同一存储空间…...

Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …...

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者&#xff1a; 容器服务团队&#xff1a;刘佳旭、冯诗淳 可观测团队&#xff1a;竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准&#xff08;CNCF Survey[1]&#xff09;。随着承接的业务规模越来越大&#xff0c;用户也在使…...

安卓触摸对焦

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

jupyter出现“.ipynb appears to have died. It will restart automatically.”解决方法

原因 解决方法&#xff1a;更新jupyter的版本 1.打开anaconda prompt 2、更新jupyter版本 在anaconda prompt输入以下指令 conda update jupyter如图&#xff1a;...

20250108-实验+神经网络

实验3. 神经网络与反向传播算法 3.1 计算图&#xff1a;复合函数的计算图 实验要求1&#xff1a;基于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​) 的反向传播算法&#xff08;不允许使用自动微分&#xff09;&a…...

【权限管理】CAS(Central Authentication Service)

CAS&#xff08;Central Authentication Service&#xff09;是一种广泛应用的 单点登录&#xff08;SSO&#xff09; 协议&#xff0c;它允许用户在一个集中式的身份验证系统中登录一次后&#xff0c;便可以无缝访问多个应用系统&#xff0c;而无需重复登录。CAS 通过统一的身…...

Golang笔记:使用net包进行TCP监听回环测试

文章目录 前言TCP监听回环代码演示 附&#xff1a;UDP监听回环 前言 TCP是比较基础常用的网络通讯方式&#xff0c;这篇文章将使用Go语言实现TCP监听回环测试。 本文中使用 Packet Sender 工具进行测试&#xff0c;其官网地址如下&#xff1a; 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 传引用调用&#xff08;模拟&#xff09;2.3 引用调用&#xff08;C 特性&#xff09; 3. 内部函数与外部函数3.1 内部函数3.2 外部函数3.3 示例&#xff1a;多个…...

NRC优先级中比较特殊的—NRC0x13和NRC0x31

1、基础知识 大家都了解 NRC0x13&#xff0c;表示长度错误和格式错误 NRC0x31&#xff0c;表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分&#xff1a; 2.1、先看NRC0x13 步骤一&#xff1a;仔细看是先判断Minmun Length Check &#xff0…...

ref() 和 reactive() 区别

ref() 和 reactive() 都是 Vue 3 中用于创建响应式数据的方法&#xff0c;但它们之间存在一些关键差异。 首先&#xff0c;ref() 用于创建响应式的标量值&#xff0c;比如数字、字符串、布尔值等基本数据类型&#xff0c;以及对象和数组等复杂数据类型。当你使用 ref() 时&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...