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

Java面试第十二山!《Redis缓存》

  大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢!

一、Redis是什么?为什么用它?

Redis(Remote Dictionary Server) 是一个高性能的 内存数据库,支持多种数据结构(如String、Hash、List、Set等),常用于缓存、分布式锁、消息队列等场景。

为什么用Redis?

  • 极速读写:数据存储在内存,比磁盘数据库快100倍以上。
  • 缓解数据库压力:将热点数据缓存到Redis,避免频繁访问数据库。
  • 丰富的数据结构:灵活应对不同业务场景(如排行榜用ZSet)。
  • 高可用:支持主从复制、哨兵、集群模式,保障服务稳定性。

二、Redis核心数据结构与使用场景

数据结构特点典型应用场景示例代码(Java)
String最简单的Key-Value存储缓存验证码、计数器set user:1 "Alice"
Hash存储对象属性用户信息、商品详情hset product:1001 name "Phone" price 5000
List有序、可重复消息队列、最新消息列表lpush news "Update1"
Set无序、去重好友关系、抽奖去重sadd friends:1 "user2" "user3"
ZSet有序、按分数排序排行榜、延迟任务zadd leaderboard 95 "PlayerA"

三、Redis缓存三大经典问题及解决方案

1. 缓存穿透(查不存在的数据)

问题:大量请求绕过缓存,直接访问数据库(如查询ID=-1的数据)。

解决

  • 布隆过滤器:预加载合法Key,拦截非法请求。
  • 缓存空值set key:null " " 300(设置短过期时间)。

2. 缓存雪崩(大量Key同时过期)

问题:缓存集中失效,数据库瞬间压力激增。

解决

  • 随机过期时间expire key 3600 + random(600)
  • 集群部署:Redis Cluster分散节点压力。

3. 缓存击穿(热点Key过期)

问题:某个热点Key失效,大量并发请求直达数据库。

解决

  • 互斥锁:使用setnx命令保证只有一个线程重建缓存。
  • 永不过期:逻辑过期时间 + 异步更新。

四、持久化机制:RDB vs AOF

机制原理优点缺点适用场景
RDB定时生成数据快照文件小,恢复快可能丢失最后一次快照后的数据容灾备份
AOF记录所有写操作命令数据完整性高文件大,恢复慢高数据安全要求场景

生产建议:开启 AOF + RDB 混合模式(Redis 4.0+),兼顾性能与安全。


五、Redis高可用方案

1. 主从复制(Master-Slave)

主节点写,从节点读,数据异步同步。         缺点:主节点宕机需手动切换。

2. 哨兵模式(Sentinel)

  • 自动监控主节点状态,故障自动切换。
  • 架构图:

3. Cluster集群

  • 数据分片存储,支持水平扩展。
  • 每个节点负责一部分槽(slot),通过CRC16算法分配。

六、Java操作Redis实战

1. 客户端选择

  • Jedis:同步阻塞,简单易用。

  • Lettuce(推荐):基于Netty,支持异步、响应式编程,连接可复用。

2. Spring Data Redis整合

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(RedisSerializer.string());
        template.setValueSerializer(RedisSerializer.json());
        return template;
    }
}

// 使用注解缓存
@Cacheable(value = "user", key = "#userId")
public User getUserById(String userId) {
    // 查询数据库
}

注意事项

  • 避免大Key(如超过10KB的String)。

  • 使用连接池配置(如最大连接数、超时时间)。

  • 监控慢查询:slowlog get 10


七、高频面试题整理

1. Redis为什么快?

内存操作、单线程避免竞争、IO多路复用。

2. 如何选择数据结构?

根据业务需求,如统计UV用HyperLogLog。

3. 内存淘汰策略有哪些?

volatile-lru(最近最少使用)、allkeys-random等,共8种策略。

4. 如何实现分布式锁?

setnx + expire 或 RedLock算法。


八、总结

Redis是Java面试必考的高频知识点,掌握其核心概念、数据结构、缓存问题解决方案及高可用架构,能让你在面试中脱颖而出。建议结合实际项目经验(如用Redis优化接口响应时间),并动手实践集群搭建与性能调优。

学习资源推荐

  • 《Redis设计与实现》

  • Redis官方文档:redis.io

  • 在线实验:Redis Labs


翻过这座山,他们就会听到你的故事!转发本文给需要的朋友,一起备战金三银四! 🚀

相关文章:

  • resnet与densenet的比较
  • 甘特图dhtmlx-gantt 一行多任务
  • MySQL-索引的使用
  • Docker Swarm集群搭建
  • 自然语言处理|深入解析 PEGASUS:从原理到实践
  • 电脑节电模式怎么退出 分享5种解决方法
  • ssh命令
  • 负载均衡的在线OJ项目
  • Redis核心机制(一)
  • 【智能体】| 知识库、RAG概念区分以及智能体是什么
  • 大数据学习(77)-Hive详解
  • 深度洞察:DeepSeek 驱动金融行业智能化转型变革
  • Nginx参数调优脚本
  • 基于springboot的免税商品优选购物商城(020)
  • Java面试黄金宝典5
  • MySql 存储引擎 InnoDB 与 MyISAM 有什么区别
  • 知识库项目开场白
  • 【Linux】线程同步与生产消费者模型
  • Qt6.8.2中JavaScript调用WebAssembly的js文件<2>
  • Redis JSON 用id读取content总结(sendCommand())
  • 同济大学原常务副校长、著名隧道及地下工程专家李永盛逝世
  • 人民日报刊文:守护“技术进步须服务于人性温暖”的文明底线
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 欧盟公布关税反制清单,瞄准美国飞机、汽车等产品
  • 专访|高圆圆:像鸟儿一样,柔弱也自由
  • 体坛联播|双杀阿森纳,巴黎晋级欧冠决赛对阵国际米兰