标签题目
Redis相关面试题
Redis Lua 脚本怎么实现分布式锁
这题考察 Redis 分布式锁的正确最小模型:SET NX PX 原子加锁、唯一 value 标识持有者、Lua 原子校验后删除,以及过期、续期和主从故障风险。
同题还出现在 1 个公司岗位
Redis 常见数据结构有哪些?
这题不只是列 Redis 类型,还要能按访问模式、底层编码、复杂度和大 key 风险说明为什么这样建模。
同题还出现在 1 个公司岗位
Redis 分布式锁的单点故障怎么解决?
这题考察 Redis 锁在单点、异步复制和故障切换下的互斥风险,需要按安全等级给出方案,而不是只说上集群。
Redis 持久化机制有哪些?
这题考察 RDB、AOF、混合持久化的恢复链路和可靠性取舍,还要区分持久化、复制和高可用解决的问题不同。
Redis 热点缓存数据如何处理?
考察 Redis 热 key 的识别、读流量分散、缓存重建保护和强弱一致性取舍,核心是先定位热点再按业务语义降压。
Redis 如何删除和淘汰过期数据?
Redis 过期数据的处理分两层:先通过惰性删除和定期删除清理已经到期的 key;当内存仍然超过 maxmemory 时,再按淘汰策略驱逐候选数据。面试回答要区分“过期删除”和“内存淘汰”,再说明为什么 Redis 采用抽样和渐进式清理。
Redis 内存满了会发生什么?
Redis 内存满了之后的行为取决于 maxmemory 和 maxmemory-policy:可能触发淘汰并继续写入,也可能拒绝会增加内存的写命令。回答时要说明触发时机、策略分类、近似算法以及对业务的影响。
Redis 为什么速度快?
Redis 快的原因不是单点魔法,而是内存访问、高效数据结构、单线程事件循环、I/O 多路复用、协议简单和工程优化共同作用。回答时要避免只说“因为单线程”,还要说明单线程为什么反而减少了锁竞争。
Redis ZSet 底层如何实现?
ZSet 的底层实现要抓住两点:它同时需要按 member 快速查分数,又需要按 score 有序范围查询。因此典型实现是字典加跳表,小规模时使用紧凑编码以节省内存。
Redis 主从同步有哪些策略?
Redis 主从同步主要包括全量同步、部分重同步和命令传播三类链路。第一次复制或偏移量缺失时走全量,短暂断线且复制积压缓冲区仍保留缺失命令时走部分重同步,正常状态下主节点持续把写命令传播给从节点。
Redis 怎么做数据迁移?
Redis 数据迁移没有单一标准答案,要按停机窗口、数据规模、是否跨版本、是否集群、是否需要保留 TTL 和一致性要求选择方案。常见方式包括 RDB/AOF 迁移、主从复制切换、SCAN+DUMP/RESTORE、MIGRATE、集群 reshard 和专用同步工具。
Redis 缓存雪崩、击穿和穿透分别是什么,如何解决?
缓存雪崩、击穿和穿透都是缓存失效后流量打到后端的风险,但触发条件不同:雪崩是大面积不可用,击穿是热点 key 瞬时失效,穿透是请求的数据本来就不存在。回答时要先分类,再分别给出限流、降级、互斥重建、空值缓存、布隆过滤器和 TTL 随机化等治理手段。
Redis的List底层实现原理?
Redis List 的底层实现经历过从 ziplist 与 linkedlist 的组合,到 quicklist 统一承载的演进。核心目标不是单纯追求某一种操作最快,而是在两端插入删除、内存占用、缓存友好性和中间位置修改之间做平衡。回答时要讲清:List 是有序、可重复、按插入顺序组织的线性结构,适合队列、栈、简单消息流等场景,但索引访问和中间元素定位不是它的强项。
为什么要用redis?
Redis 的核心价值不是更快的数据库,而是把高频、低延迟、可短期容忍一致性差异的数据放到内存侧处理,从而缩短读写链路、削峰填谷、降低关系型数据库压力,并利用丰富数据结构、原子命令、过期机制和高可用能力支撑缓存、计数、排行榜、限流、会话、队列等典型场景。
Redis 缓存淘汰策略有哪些?
这题要先区分两个概念:过期删除是针对设置了 TTL 的键,缓存淘汰是 Redis 在内存达到 maxmemory 限制后,为了腾出空间而选择删除哪些键。回答时不能只背策略名称,还要说明 allkeys 与 volatile 的区别、LRU/LFU/TTL/random/noeviction 的选择逻辑,以及这些策略在读多写多、冷热数据明显、TTL 管理严格等场景下的取舍。
Redis 为什么高可用?
Redis 的高可用不是单一能力,而是复制、故障检测、自动切换、分片容灾、持久化、客户端重连和监控治理共同组成的体系。主从复制提升读扩展和副本冗余,哨兵负责发现主节点故障并自动完成主从切换,Cluster 通过分片和多主多从避免单机容量与单点问题,AOF/RDB 持久化降低进程或机器故障后的数据损失。真正回答这道题时,要同时说明 Redis 能恢复服务、能减少数据丢失,但不能承诺在所有极端场景下零丢失,尤其要讲清复制延迟、脑裂和一致性取舍。
为什么Redis的速度这么快?
Redis 快不是单一原因,而是数据结构、内存访问、事件模型、网络处理和工程取舍共同作用的结果。面试回答时不能只说“因为它是内存数据库”或“因为单线程”,更关键的是说明:绝大多数请求走内存,核心命令复杂度低;单线程事件循环减少锁竞争和上下文切换;I/O 多路复用提升并发连接处理能力;协议和数据结构实现轻量;同时 Redis 也通过持久化、复制、集群等机制在速度与可靠性之间做取舍。
集群环境怎么更新本地缓存?
集群环境更新本地缓存的核心是把进程内缓存视为性能优化层,而不是共享事实源。常见方案是数据库作为最终事实源,Redis 作为跨节点共享缓存,本地缓存作为单机热点加速层;数据变更后通过可靠事件广播删除各实例本地缓存,并用 TTL、版本号和补偿机制兜底。
Redis是否支持事务?
Redis 支持事务,但它的事务更像“命令批量排队并按顺序一次性执行”的机制,而不是关系型数据库里带自动回滚、强一致约束检查的事务。面试回答要强调 MULTI、EXEC、DISCARD、WATCH 的作用,以及入队错误和执行期错误的处理差异。
热点数据怎么保证redis和db中的一致?
热点数据的 Redis 与数据库一致性,核心不是追求所有场景下绝对强一致,而是先明确业务可接受的一致性等级,再选择缓存模式、写入顺序、失效策略和补偿机制。高频面试答案应围绕 Cache Aside、先更新数据库再删除缓存、删除失败补偿、TTL 兜底、版本号防乱序、binlog/CDC 异步修复、热点保护与强一致场景降级到串行化读写展开。
redis的gossip机制?
Redis Cluster 的 Gossip 机制是集群节点之间交换状态信息的一套去中心化通信机制。每个节点不依赖中心协调者,而是通过定期向其他节点发送 PING、PONG、MEET 等消息,携带自己已知的节点元数据、槽位信息、配置纪元和故障判断结果,使整个集群逐步达成状态收敛,并用于节点发现、拓扑维护、故障疑似与故障确认。
Redis解决了什么问题?
Redis 本质上解决的是把需要极低延迟、高并发访问、临时状态管理和轻量计算的数据,从慢路径中抽出来的问题。它不是关系型数据库的替代品,而是用内存读写、丰富数据结构、过期机制、原子操作、持久化和集群能力,帮助系统降低数据库压力、提升响应速度、承载热点流量,并处理计数、排行榜、会话、限流、分布式锁等高频场景。
Redis的过期策略?
Redis 的过期策略本质上是在性能、内存回收及时性和主线程延迟之间做平衡:它不会为每个带 TTL 的键单独启动定时器,而是通过 TTL 元数据记录过期时间,再结合访问时惰性删除和后台周期性主动抽样删除来清理过期键。回答时要区分过期删除与内存淘汰,并补充持久化、复制、过期风暴和热 Key 场景下的工程治理。
说一下数据库底层数据结构B+数据,为什么用,与二叉平衡树区别 Redis怎么用的?
数据库索引常用 B+ 树,核心原因不是“查找复杂度看起来是 O(log n)”,而是它非常适合磁盘和页式存储:节点扇出高,树高低,单次查询需要的页访问次数少;叶子节点按键有序并通过链表连接,范围查询、排序扫描、分页扫描都很高效。二叉平衡树如 AVL、红黑树更适合内存中的动态查找结构,节点扇出低、树高大、局部性差,如果直接用于磁盘索引会产生大量随机 I/O。
还知道哪些缓存中间件?
缓存中间件不只有 Redis。可以按部署位置和能力分为远程内存缓存、进程内本地缓存、分布式缓存、CDN/HTTP 缓存、数据库内部缓存,以及用于削峰和结果复用的消息缓存、结果缓存。回答这题的关键不是罗列产品名,而是说明 Redis、Memcached、Caffeine、Ehcache、Hazelcast、Ignite、CDN、数据库 Buffer Pool 等分别解决什么问题,以及选型时如何比较数据结构、持久化、一致性、延迟和运维复杂度。
Redis的过期机制和删除机制是什么?
Redis 过期机制用于处理设置了生存时间的 key,核心数据结构是 expires 过期字典;删除过期 key 主要依赖惰性删除和定期主动过期。过期机制解决的是 key 到期后如何消失,内存淘汰解决的是内存不够时牺牲哪些 key,二者不能混淆。
Redis 分布式锁如何实现?
Redis 分布式锁的核心不是用一个 key 表示占用,而是要同时解决互斥、死锁、误删、超时、续期、主从切换和业务兜底。标准实现通常是 SET key token NX PX ttl 获取锁,用唯一 token 标识持有者,用 Lua 脚本先比较 token 再删除来释放锁。
redis如何保证高可用的?
redis如何保证高可用的?这道腾讯牛客题的关键是围绕“Redis 高可用”讲清概念、机制、取舍和边界。Redis 高可用通常由主从复制、Sentinel 或 Cluster 实现。主从复制提供副本,Sentinel 负责监控和自动故障转移,Cluster 通过 slot 分片和副本接管提升容量与可用性。
redis与mysql如何保持一致的?
redis与mysql如何保持一致的?这道腾讯牛客题的关键是围绕“缓存与数据库一致性”讲清概念、机制、取舍和边界。缓存和数据库通常很难做到强一致,工程上多采用 Cache Aside 并接受短暂最终一致。常见写法是先更新数据库,提交成功后删除缓存;删除失败要有重试、消息补偿或 binlog/CDC 修正。
redis过期key是如何处理的?
redis过期key是如何处理的?这道腾讯牛客题的关键是围绕“Redis 过期 key 处理”讲清概念、机制、取舍和边界。Redis 过期 key 通过惰性删除和定期删除结合处理。访问 key 时先检查 TTL,过期则删除;后台周期性从 expires 字典抽样检查过期 key,控制单次删除耗时,避免阻塞主线程太久。
redis缓存击穿、穿透、雪崩及其解决方法?
redis缓存击穿、穿透、雪崩及其解决方法?这道腾讯牛客题的关键是围绕“缓存异常流量防护”讲清概念、机制、取舍和边界。缓存穿透、击穿和雪崩都是缓存层保护后端数据源时常见的异常流量问题。穿透是请求的数据本身不存在导致反复打到后端;击穿是热点 key 过期瞬间大量请求回源;雪崩是大量 key 同时失效或缓存集群不可用导致整体回源压力暴涨。
为什么redis这么快?
为什么redis这么快?这道腾讯牛客题的关键是围绕“Redis 单线程与高性能”讲清概念、机制、取舍和边界。Redis 快主要因为数据在内存中、数据结构高效、命令执行主路径单线程避免锁竞争、事件循环配合 I/O 多路复用处理大量连接。Redis 单线程通常指命令执行线程,后台持久化、异步删除、网络 I/O 线程等并不都在同一个线程。
Redis 有哪些数据结构?
Redis 有哪些数据结构?这道腾讯牛客题的关键是围绕“Redis 数据结构与底层编码”讲清概念、机制、取舍和边界。Redis 常用对外数据结构包括 String、List、Hash、Set、ZSet、Bitmap、HyperLogLog、Geo 和 Stream。回答时还要区分对外类型和底层编码,例如 SDS、listpack、quicklist、dict、intset 和 skiplist。
redis是单线程还是多线程,为什么用单线程?
redis是单线程还是多线程,为什么用单线程?这道腾讯牛客题的关键是围绕“Redis 单线程与高性能”讲清概念、机制、取舍和边界。Redis 快主要因为数据在内存中、数据结构高效、命令执行主路径单线程避免锁竞争、事件循环配合 I/O 多路复用处理大量连接。Redis 单线程通常指命令执行线程,后台持久化、异步删除、网络 I/O 线程等并不都在同一个线程。
redis是单线程还是多线程,为什么用单线程,为什么不用多线程?
redis是单线程还是多线程,为什么用单线程,为什么不用多线程?这道腾讯牛客题的关键是围绕“Redis 单线程与高性能”讲清概念、机制、取舍和边界。Redis 快主要因为数据在内存中、数据结构高效、命令执行主路径单线程避免锁竞争、事件循环配合 I/O 多路复用处理大量连接。Redis 单线程通常指命令执行线程,后台持久化、异步删除、网络 I/O 线程等并不都在同一个线程。
Redis 的常见数据结构有哪些?
Redis 的常见数据结构有哪些?这道腾讯牛客题的关键是围绕“Redis 数据结构与底层编码”讲清概念、机制、取舍和边界。Redis 常用对外数据结构包括 String、List、Hash、Set、ZSet、Bitmap、HyperLogLog、Geo 和 Stream。回答时还要区分对外类型和底层编码,例如 SDS、listpack、quicklist、dict、intset 和 skiplist。
为什么会使用 Redis 实现消息队列?它适合哪些场景?
为什么会使用 Redis 实现消息队列?它适合哪些场景?这道腾讯牛客题的关键是围绕“Redis 实现消息队列场景”讲清概念、机制、取舍和边界。Redis 可以做轻量消息队列,适合延迟敏感、吞吐中等、业务可接受 at-least-once 和重复消费的场景。常见实现包括 List、Pub/Sub 和 Streams,其中 Streams 更适合可靠消费。
Redis 主从复制的原理是什么?
Redis 主从复制的原理是什么?这道腾讯牛客题的关键是围绕“Redis 主从复制原理”讲清概念、机制、取舍和边界。Redis 主从复制通过从节点向主节点发起 PSYNC,同步主节点数据和后续命令流。首次或断点不可用时做全量同步,主节点生成 RDB 发送给从节点;断线重连且 backlog 足够时可做部分重同步。
业务中为什么会引入 Redis?适合哪些典型场景?
业务中为什么会引入 Redis?适合哪些典型场景?这道腾讯牛客题的关键是围绕“Redis 典型业务场景”讲清概念、机制、取舍和边界。业务引入 Redis 通常是为了低延迟访问和高吞吐状态管理。典型场景包括高频读缓存、计数器、排行榜、会话、分布式锁、限流、去重、延迟任务和轻量消息队列。
Redis 访问变慢时如何排查和优化?
Redis 访问变慢时如何排查和优化?这道腾讯牛客题的关键是围绕“Redis 访问变慢排查”讲清概念、机制、取舍和边界。Redis 变慢要按客户端、网络、Redis 命令、数据结构、内存、持久化和系统资源逐层排查。不能只说扩容或加机器,先要确认慢在连接、排队、执行、返回还是下游依赖。
Redis 如何保证消息可靠性?
Redis 如何保证消息可靠性?这道腾讯牛客题的关键是围绕“Redis 消息队列可靠性边界”讲清概念、机制、取舍和边界。Redis 可以做轻量消息队列,但可靠性取决于使用 Pub/Sub、List 还是 Streams。Pub/Sub 基本不保存离线消息,List 需要自己设计确认和重试,Streams 支持 consumer group、pending list 和 ACK,更适合需要可靠消费的场景。
Redis 的底层数据结构有哪些?跳表是如何实现的?
Redis 的底层数据结构有哪些?跳表是如何实现的?这道腾讯牛客题的关键是围绕“Redis 数据结构与底层编码”讲清概念、机制、取舍和边界。Redis 常用对外数据结构包括 String、List、Hash、Set、ZSet、Bitmap、HyperLogLog、Geo 和 Stream。回答时还要区分对外类型和底层编码,例如 SDS、listpack、quicklist、dict、intset 和 skiplist。
AI 面试系统中,多轮对话记忆如何用 Redis 存储、过期和隔离?
这题考 AI 面试系统里的短期会话记忆设计。回答要围绕 Redis 如何保存多轮对话状态、控制 TTL、做用户/会话隔离、处理并发和失败恢复,不能泛化成抽象 Agent 记忆。