Redis高频面试题深度解析(2024实战版)

前言

Redis作为当下最火的NoSQL数据库(没有之一),在面试中出现的频率堪比Java里的HashMap!今天咱们就来扒一扒那些让面试官眼睛发光的Redis灵魂拷问,看完这篇你至少能顶住三轮技术面!(实战经验+避坑指南双重buff加成)


一、Redis数据类型全家福(附必杀技)

面试官最爱问:“Redis支持哪些数据类型?各有什么使用场景?”

1.1 五大基础类型

  1. String(字符串)

    • 常规操作:SET user:1 "张三"
    • 骚操作INCR article:1001:views(原子计数器)
    • 冷知识:最大512MB!但别真存这么大的数据(内存警告⚠️)
  2. Hash(哈希)

    • 用户信息存储示范:
      HSET user:1001 name "李四" age 28 
      HGET user:1001 age
      
    • 坑点预警HGETALL慎用!大哈希表会撑爆网络带宽(亲身踩雷经历)
  3. List(列表)

    • 典型场景:最新消息排行
    • 双端队列操作:
      LPUSH news:list "突发:Redis 7.0发布"
      RPOP news:list
      
  4. Set(集合)

    • 实战案例:共同好友计算
      SINTER user:1001:friends user:1002:friends
      
    • 性能秘籍:2^32-1个元素支持,但实际别超过1万(血泪教训)
  5. Zset(有序集合)

    • 排行榜实现:
      ZADD game:rank 9999 "玩家A" 8888 "玩家B"
      ZREVRANGE game:rank 0 9 WITHSCORES
      
    • 底层玄机:跳表+哈希表双结构,插入复杂度O(logN)

1.2 三大扩展类型(加分项)

  • Bitmaps:日活统计神器
  • HyperLogLog:误差<1%的UV统计
  • GEO:附近的人功能(底层其实是Zset)

二、持久化方案的生死抉择

死亡问题:“Redis的持久化机制有哪些?如何选择?”

2.1 RDB快照模式

  • 触发方式
    • 手动:SAVE(阻塞)/ BGSAVE(后台)
    • 自动:配置save 900 1(15分钟至少1次修改)
  • 优势:二进制紧凑,适合灾备
  • 致命缺陷:可能丢失最后几分钟数据(金融场景慎用!)

2.2 AOF日志模式

  • 写策略三档
    1. appendfsync always(最安全)
    2. appendfsync everysec(折中推荐)
    3. appendfsync no(交给操作系统)
  • AOF重写机制
    redis-cli BGREWRITEAOF
    
    • 原理:内存数据快照生成新AOF(注意fork耗时)

2.3 混合持久化(Redis 4.0+)

  • 配置项:aof-use-rdb-preamble yes
  • 重启加载流程
    1. 先加载RDB部分快速恢复
    2. 再加载增量AOF日志
  • 选型建议
    • 缓存场景:RDB够用
    • 金融级数据:AOF everysec + RDB每日备份
    • 折中方案:混合持久化(目前主流选择)

三、缓存穿透/雪崩/击穿三兄弟(防崩指南)

3.1 缓存穿透

现象:查询不存在的数据(比如id=-1)
解决方案

  1. 布隆过滤器拦截(推荐RedisBloom模块)
  2. 缓存空值:SET null:key "" 300
  3. 接口层校验(比如ID必须>0)

3.2 缓存雪崩

场景:大批量key同时过期
逃生方案

// 设置随机过期时间
redisTemplate.opsForValue().set(key, value, 
    30*60 + (int)(Math.random()*300)); 
  • 进阶操作
    • 永不过期+异步更新
    • 熔断降级(Hystrix/Sentinel)

3.3 缓存击穿

痛点:热点key突然失效
破局之道

  1. 互斥锁重建:
    SETNX lock:key "1" 
    EXPIRE lock:key 10
    
  2. 逻辑过期时间(实际数据不过期)
  3. 缓存预热(大促前提前加载)

四、集群方案华山论剑

4.1 主从复制

  • 同步流程
    1. 从节点发送SYNC
    2. 主节点执行BGSAVE
    3. 传输RDB文件
    4. 传输缓冲区命令
  • 监控命令INFO replication

4.2 Sentinel哨兵

  • 部署建议:至少3个哨兵节点
  • 故障转移步骤
    1. 主观下线(SDOWN)
    2. 客观下线(ODOWN)
    3. 选举Leader哨兵
    4. 切换主节点

4.3 Cluster集群

  • 数据分片:16384个slot
  • 节点通信:Gossip协议
  • 迁移命令
    CLUSTER ADDSLOTS 0 1 2 ... 
    CLUSTER SETSLOT 1000 IMPORTING node_id
    

五、高频灵魂拷问TOP5

  1. Redis为什么快?

    • 内存操作
    • IO多路复用
    • 单线程避免上下文切换
    • 高效数据结构
  2. 缓存与数据库一致性如何保证?

    • 先更新DB再删缓存
    • 延迟双删策略
    • 订阅binlog同步(canal)
  3. Pipeline有什么用?

    • 批量命令打包发送
    • 示例:
      List<Object> results = redisTemplate.executePipelined(...)
      
  4. 大Key问题怎么处理?

    • redis-cli --bigkeys扫描
    • 拆分(比如hash拆分为多个key)
    • 渐进式删除(UNLINK替代DEL)
  5. Redis6.0多线程改进在哪?

    • 网络IO多线程化(执行命令还是单线程)
    • 配置项:io-threads 4

六、面试翻车现场实录

去年面某大厂时被问:“假设Redis内存满了,继续写入会怎样?”

  • 错误回答:“应该会报错吧?”
  • 正确答案
    • maxmemory-policy配置:
      • volatile-lru:淘汰有过期时间的key
      • allkeys-lfu:全库淘汰
      • noeviction:直接报错(默认策略)

最后叮嘱(必看!)

  1. 实验环境准备好redis-cli(在线练习平台也行)
  2. 重点掌握Redis的OBJECT encoding key命令
  3. 学会用slowlog get分析性能瓶颈
  4. 最新动态关注Redis 7.0的Stream改进
  5. 切记:分布式锁用Redlock要谨慎!

祝各位面试时就像Redis一样——又快又稳! (记得面试前吃个士力架,别问我怎么知道的)

你可能感兴趣的:(redis,数据库,缓存)