Redis面试高频考点深度剖析(附场景题)

📌 必知必会五大数据类型(附新特性)

1. String类型(最基础但别小看)

  • 典型场景:缓存用户信息(序列化JSON)、计数器(阅读量统计)
  • 骚操作INCR做分布式锁(注意!不是银弹)、SETNX实现简单限流
  • 冷知识:value最大512MB!(存小文件?可以但没必要)

2. Hash类型(对象存储神器)

HMSET user:1001 name "老王" age 28 score 95
HGETALL user:1001
  • 优势:字段级操作,比String更省内存(重要!!)
  • 坑点:超过500个字段时,编码方式会变(性能影响!)

3. List类型(不只是队列)

  • 应用场景
    • 消息队列(LPUSH+BRPOP)
    • 最新评论展示(LTRIM保持N条)
  • 隐藏技巧BLPOP 实现阻塞队列(比轮询高效十倍!)

4. Set类型(去重王者)

  • 典型应用
    • 共同好友(SINTER)
    • 抽奖黑名单(SISMEMBER)
  • 性能警告:SMEMBERS操作大集合会炸!(用SSCAN代替)

5. ZSet类型(排行榜必备)

ZADD hotNews 1000000 "中美贸易战" 950000 "AI突破"
ZREVRANGE hotNews 0 4 WITHSCORES
  • 底层结构:跳跃表+字典(查询O(logN))
  • 实战技巧ZRANGEBYSCORE 做延时队列(比RocketMQ轻量)

🆕 新特性Stream类型(面试加分项!)

  • 类Kafka的消费组模式
  • 消息持久化 + ACK机制
  • 适合做消息追溯场景

💣 持久化机制灵魂拷问(必考题!!)

RDB vs AOF 世纪对决

RDBAOF
持久化方式内存快照操作日志追加
数据安全可能丢失分钟级数据最多丢失1秒数据(配置决定)
恢复速度快(直接加载二进制)慢(重放所有命令)
文件大小小(压缩二进制)大(文本日志日积月累)

混合持久化(Redis4.0+)

  • 触发条件aof-use-rdb-preamble yes
  • 运作机制:AOF文件 = RDB头 + AOF增量
  • 优势:兼顾启动速度与数据安全(这个设计绝了!)

🚨 缓存三大经典问题(送命题!!)

缓存穿透(查不到)

  • 场景:查询不存在的数据(比如id=-1)
  • 解决方案
    1. 布隆过滤器拦截(前置过滤)
    2. 缓存空值(注意过期时间!)
    3. 接口鉴权(防恶意攻击)

缓存雪崩(集体失效)

  • 致命场景:大量key同一时间过期
  • 保命方案
    • 随机过期时间(基础版)
    • 热点数据永不过期(进阶版)
    • 熔断降级(Hystrix走起)

缓存击穿(热点key失效)

public Object getData(String key) {
    Object value = redis.get(key);
    if (value == null) {
        if (redis.setnx(key_mutex, 1)) { // 分布式锁
            value = db.get(key); 
            redis.set(key, value);
            redis.del(key_mutex);
        } else {
            Thread.sleep(50);
            return getData(key); // 重试
        }
    }
    return value;
}
  • 核心思路:互斥锁重建缓存(注意锁超时!)

🌐 集群方案对比(架构设计必问)

1. 主从复制(读写分离基础)

  • 同步原理:全量同步 + 增量同步
  • 致命缺陷:主节点挂了要手动切换(生产环境慎用!)

2. 哨兵模式(高可用方案)

  • 监控机制:每秒ping检查节点状态
  • 故障转移
    1. 主观下线(单个哨兵判断)
    2. 客观下线(多数哨兵确认)
    3. 选举新主(Raft算法)

3. Cluster模式(官方分布式方案)

  • 数据分片:16384个slot(每个节点负责部分)
  • 重定向机制:MOVED/ASK响应指引客户端
  • 优势:自动故障转移 + 水平扩展(生产首选!)

💡 高频进阶问题(P7以上必看)

1. 管道化 vs 事务

  • 管道(Pipeline):批量发送命令(减少网络开销)
  • 事务(Multi):命令打包原子执行(但非回滚!)
  • 冷知识:事务中的命令会排队,不保证其他客户端的可见性

2. 内存淘汰策略

  • volatile-lru:从过期key中淘汰最近最少使用的
  • allkeys-random:全体key随机淘汰
  • 自定义策略:配合LFU算法(Redis4.0+)

3. 热key处理方案

  • 本地缓存:Guava Cache二级缓存
  • 分片存储:对key做hash打散
  • 监控预警:redis-cli --hotkeys 找出热点

🛠️ 实战设计题(检验真功夫)

场景:设计微博点赞系统

  1. 存储设计

    • 使用Hash存储每个帖子的点赞用户(field=用户ID,value=点赞时间)
    • ZSet存储热门帖子排行榜(score=点赞数)
  2. 性能优化

    • 本地计数+定时同步(缓解写压力)
    • 读写分离(从节点处理统计查询)
  3. 异常处理

    • 点赞去重(HINCRBY原子操作)
    • 数据补偿(定时扫描日志对账)
// 伪代码示例
public void likePost(long userId, long postId) {
    String key = "post_likes:" + postId;
    if (redisCommand.hsetnx(key, String.valueOf(userId), System.currentTimeMillis())) {
        redisCommand.zincrby("hot_posts", 1, String.valueOf(postId));
    }
}

📝 面试技巧(最后叮嘱!!)

  1. 原理题回答公式:应用场景 -> 底层结构 -> 优缺点 -> 同类对比
  2. 设计题套路:先说业务场景 -> 拆分功能模块 -> 选型依据 -> 异常处理
  3. 遇到不会:大方承认+分析思路(千万别瞎编!)
  4. 反问环节:问团队Redis使用场景(体现主动性)

记住:Redis不是银弹!一定要结合业务场景谈技术选型(这句说出来面试官眼睛会亮✨)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值