Java面试八股文Redis篇

1. 介绍下Redis,Redis有哪些数据类型?

Redis是开源的内存数据结构存储系统,常用作数据库、缓存和消息中间件,支持持久化。
数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合),以及Bitmaps、HyperLogLog、Geospatial、Stream等扩展类型。


2. Redis提供了哪几种持久化方式?

  • RDB :定期生成内存快照,保存到.rdb文件,适合备份与快速恢复。
  • AOF :记录每次写命令到.aof文件,支持不同同步策略(每秒/每次命令),数据更安全。
  • 混合持久化(Redis 4.0+):结合RDB与AOF,AOF重写时以RDB格式开头,兼顾恢复速度与数据完整性。

3. Redis为什么快?

  • 基于内存操作,读写速度快。
  • 单线程模型,避免上下文切换和锁竞争。
  • 高效I/O多路复用(epoll等),处理高并发连接。
  • 简洁高效的数据结构和底层编码(如SDS、ziplist、跳表等)。

4. Redis为什么是单线程的?

单线程简化了设计和实现,避免多线程的竞争、死锁等问题;瓶颈不在CPU,而在内存和网络I/O,单线程配合I/O多路复用足以达到高性能。
注:Redis 6.0后引入多线程处理网络I/O,但核心命令执行仍为单线程。


5. Redis服务器的内存是多大?

默认无硬性上限,通过maxmemory配置限制。生产环境根据机器资源和业务需求设定,避免OOM导致系统故障。


6. 为什么Redis的操作是原子性的,怎么保证原子性的?

Redis单线程执行命令,天然保证每个命令的原子性。

对于多个命令的原子性,可通过Lua脚本或MULTI/EXEC事务(部分支持,非严格ACID)实现。


7. Redis有事务吗?

有,通过MULTIEXECWATCH等命令实现。事务中命令依次执行,不被其他命令打断,但不支持回滚;WATCH可实现乐观锁。


8. Redis数据和MySQL数据库的一致性如何实现?

常见方案:

  • 先更新数据库,再删除缓存(推荐),配合消息队列或Canal监听binlog异步重试删除。
  • 设置合理过期时间,作为兜底。
  • 读写锁/双删 等策略降低并发不一致风险。
    最终一致性可满足大部分场景,强一致则需分布式事务或避免使用缓存。

9. 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案

  • 穿透 :查询不存在数据,绕过缓存直击DB。
    → 布隆过滤器、缓存空对象。
  • 击穿 :热点key过期,高并发同时查DB。
    → 互斥锁、逻辑过期、永不过期(异步更新)。
  • 雪崩 :大量key同时过期或Redis宕机。
    → 过期时间加随机值、多级缓存、集群高可用、限流降级。

10. 哨兵模式是什么样的?

哨兵(Sentinel)是Redis的高可用方案:

  • 监控主从节点健康状态。
  • 自动故障转移,当主节点宕机时选举新主。
  • 通过投票机制实现,通常部署奇数个(≥3)实例防止脑裂。

11. Redis常见性能问题和解决方案

  • 大key:拆分、优化数据结构、使用unlink异步删除。
  • 热key:多级缓存、读写分离、本地缓存。
  • 慢查询:优化命令(避免keys *)、使用scan替代。
  • fork耗时(RDB/AOF重写):控制内存、减少写时复制开销。
  • 网络延迟:使用pipeline、长连接、部署同机房。

12. MySQL里有大量数据,如何保证Redis中的数据都是热点数据?

  • 设置maxmemory + volatile-lruallkeys-lru淘汰策略。
  • 只缓存高频访问数据,通过流量统计或业务标记。
  • 利用LFU(Redis 4.0+)更精准识别热点。

13. Redis集群方案应该怎么做?都有哪些方案?

  • 客户端分片:应用层实现路由,不推荐。
  • Twemproxy/Codis:代理中间件,支持分片。
  • Redis Cluster(官方):去中心化,使用哈希槽,支持线性扩展和故障转移。

14. 说说Redis哈希槽的概念

Redis Cluster将数据分为16384个哈希槽,每个key通过CRC16(key) % 16384确定所在槽,集群节点分别负责部分槽。

增减节点时只需迁移槽,实现平滑扩展。


15. Redis有哪些适合的场景?

  • 缓存(热点数据、Session、页面)
  • 计数器、限流
  • 排行榜(Sorted Set)
  • 消息队列(Stream、List)
  • 分布式锁(Redlock、setnx)
  • 去重、签到(Set、Bitmaps)
  • 地理位置功能(Geospatial)

16. Redis在项目中的应用

(结合项目经历简要说明)

例如:

  • 作为首页缓存,降低MySQL压力。
  • 利用Sorted Set实现榜单实时更新。
  • 用Redisson实现分布式锁,保证定时任务单点执行。
  • 通过Stream做异步任务队列,提升系统吞吐。
相关推荐
lzhdim3 小时前
SQL 入门 7:SQL 聚合与分组:函数、GROUP BY 与 ROLLUP
java·服务器·数据库·sql·mysql
弹简特3 小时前
【JavaEE】Mybatis实现分页查询功能
java·java-ee·mybatis
烤麻辣烫3 小时前
I/O流 基础流
java·开发语言·学习·intellij-idea
Jasonakeke3 小时前
我的编程来时路
java·c++·python
Yvonne爱编码3 小时前
Java 中的 hashCode () 与 equals () 核心原理、契约规范、重写实践与面试全解
java·开发语言·数据结构·python·hash
gelald3 小时前
JVM - 运行时内存模型
java·jvm·后端
老虎06273 小时前
Java基础面试题(08)—Java(集合—HashMap的使用和实现原理红黑树)
java·开发语言
Arthas2173 小时前
互联网大厂Java面试实录:谢飞机的电商微服务之旅 - Spring Boot/Cloud/Redis/Kafka实战
spring boot·redis·spring cloud·微服务·kafka·java面试·电商
IAtlantiscsdn3 小时前
Redis面试题总结
数据库·redis·缓存
左左右右左右摇晃3 小时前
Java笔记——JMM
java·后端·spring