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

字节一面:Redis 和 Caffeine 的区别是什么?

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview

面试考察点

  1. 缓存架构理解:面试官不仅仅是想知道两者的功能差异,更是想考察你是否理解 "本地缓存" 与 "分布式缓存" 的本质区别,以及在系统架构中各自扮演的角色。

  2. 技术选型能力:考察你是否能够根据业务场景(数据量、一致性要求、性能需求)做出合理的技术选型,而不是盲目跟风。

  3. 实践经验:是否在实际项目中使用过这两种缓存,是否了解它们在生产环境中的坑和最佳实践。

核心答案

Redis 和 Caffeine 是两种不同类型的缓存,核心区别在于存储位置架构模式

对比维度

Redis

Caffeine

缓存类型

分布式缓存

本地缓存(进程内缓存)

存储位置

独立服务进程,可部署多节点

应用 JVM 进程内

访问速度

网络开销,毫秒级

直接内存访问,纳秒级

数据一致性

多节点共享,一致性好

各节点独立,存在不一致风险

容量限制

可配置大容量(GB 级别)

受 JVM 堆内存限制

持久化

支持 RDB/AOF 持久化

进程重启数据丢失

数据结构

丰富(String、Hash、List、Set、ZSet 等)

简单 KV 存储

集群支持

原生支持主从、哨兵、集群

单机,无集群概念

一句话总结:Redis 是分布式缓存,适合跨服务共享数据;Caffeine 是本地缓存,适合单节点高性能读取。

深度解析

一、架构模式对比

Redis 分布式缓存架构

上图展示了 Redis 的分布式缓存架构。所有服务实例通过网络访问同一个 Redis 集群,实现数据共享。特点是:

  1. 数据共享:多个服务实例看到的是同一份数据,天然保证一致性

  2. 独立部署:Redis 作为独立服务,可横向扩展

  3. 网络开销:每次访问都需要网络通信,存在毫秒级延迟

img

上图展示了 Caffeine 的本地缓存架构。每个服务实例都有自己独立的 Caffeine 缓存,存储在各自的 JVM 堆内存中。特点是:

  1. 数据隔离:各实例缓存独立,可能存在数据不一致

  2. 极速访问:直接内存读取,纳秒级响应

  3. 容量受限:受 JVM 堆内存大小限制

二、性能对比

场景

Redis

Caffeine

性能差距

单次读取

~1ms(网络 + 反序列化)

~100ns

10000 倍

单次写入

~1ms

~100ns

10000 倍

高并发读取

受网络带宽限制

仅受 CPU 限制

差距明显

三、典型使用场景

Redis 适合的场景:

// 1. 分布式 Session 存储 // 2. 跨服务共享的配置数据 // 3. 分布式锁 // 4. 消息队列(延迟队列) // 5. 排行榜、计数器 // 6. 需要持久化的缓存数据 @Autowired private StringRedisTemplate redisTemplate; // 分布式锁示例 public boolean tryLock(String key, String value, long expireTime) { return Boolean.TRUE.equals( redisTemplate.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.SECONDS) ); }

Caffeine 适合的场景:

// 1. 热点数据的本地缓存(如配置、字典数据) // 2. 高频读取、低频更新的数据 // 3. 对一致性要求不高的场景 // 4. 单机应用或无需跨服务共享的数据 // Caffeine 配置示例 Cache<String, User> userCache = Caffeine.newBuilder() .maximumSize(10000) // 最大缓存数量 .expireAfterWrite(10, TimeUnit.MINUTES) // 写入后 10 分钟过期 .refreshAfterWrite(5, TimeUnit.MINUTES) // 写入后 5 分钟异步刷新 .recordStats() // 开启统计 .build(); // 获取缓存(不存在则加载) User user = userCache.get(userId, id -> userService.getById(id));

四、生产最佳实践:两级缓存架构

实际项目中,通常采用L1(本地)+ L2(分布式)两级缓存架构:

img

两级缓存的协同工作流程:

  1. 读取流程:先查 L1(Caffeine),未命中再查 L2(Redis),最后查数据库

  2. 写入流程:更新数据库后,同时删除 L1 和 L2 缓存

  3. 一致性保障:通过 Redis Pub/Sub 或消息队列通知各节点清除本地缓存

// Spring Cache + Caffeine + Redis 两级缓存示例 @Service public class UserService { @Cacheable(cacheNames = "user", key = "#id") // 自动两级缓存 public User getById(Long id) { return userMapper.selectById(id); } @CacheEvict(cacheNames = "user", key = "#user.id") // 自动清除两级缓存 public void update(User user) { userMapper.updateById(user); } }

五、常见误区

误区

说明

"本地缓存更快,全部用 Caffeine"

多实例部署时数据不一致问题严重,适合只读或容忍不一致的场景

"Redis 够用了,不需要本地缓存"

对于 QPS 极高的热点数据,Redis 网络开销可能成为瓶颈

"两级缓存太复杂,维护成本高"

Spring Cache 已提供良好抽象,配置简单,收益明显

面试高频追问

  1. 两级缓存如何保证一致性?

  • 延迟双删 + Redis Pub/Sub 通知各节点清除本地缓存

  • 设置合理的过期时间兜底

  • 使用 Canal 监听数据库 binlog 主动刷新

  • Caffeine 的淘汰策略是什么?

    • W-TinyLFU 算法,结合了 LRU 和 LFU 的优点

    • 高频 + 最近访问的数据优先保留

  • Redis 缓存穿透、击穿、雪崩怎么解决?

    • 穿透:布隆过滤器、空值缓存

    • 击穿:互斥锁、热点数据永不过期

    • 雪崩:过期时间加随机值、多级缓存

    常见面试变体

    • "本地缓存和分布式缓存的区别?"

    • "为什么要有两级缓存?"

    • "Caffeine 和 Guava Cache 的区别?"

    • "如何设计一个高可用的缓存架构?"

    记忆口诀

    选型口诀:单机高频用本地,分布式共享用 Redis,极致性能两结合。

    架构口诀:L1 快但各自飞,L2 慢但大家看,两级配合性能王。

    总结

    Redis 是分布式缓存,适合跨服务数据共享、需要持久化、复杂数据结构的场景;Caffeine 是本地缓存,适合单节点高频读取、对一致性要求不高的场景。生产环境推荐两级缓存架构:Caffeine 作为 L1 缓存提供极速响应,Redis 作为 L2 缓存保证数据一致性,通过消息机制同步各节点本地缓存。

    👉 欢迎加入小哈的星球,你将获得:专属的项目实战(多个项目) / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论

    • 新项目:《Spring AI 项目实战》正在更新中..., 基于 Spring AI + Spring Boot 3.x + JDK 21;

    • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/

    • 《从零手撸:前后端分离博客项目(全栈开发)》2期已完结,演示链接:http://116.62.199.48/;

    • 专栏阅读地址:https://www.quanxiaoha.com/column

    截止目前,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中..后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有4500+小伙伴加入

    1. 我的私密学习小圈子,从0到1手撸企业实战项目~ 2. 从夯到拉,锐评13个 Java Web 框架! 3. 面试官:什么是最左前缀匹配?为什么要遵守?(修订版) 4. 使用 Shadcn UI 构建 Java 桌面应用
    最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
    PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀,谢谢啦
http://www.jsqmd.com/news/559348/

相关文章:

  • 布斯算法在Verilog中的优化实现:如何提升乘法器性能与资源利用率
  • [AI] 实战指南:Ollama与LM Studio双框架本地部署DeepSeek模型及API集成
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4数据爬虫助手:自动生成Python爬虫脚本与反反爬策略
  • 剖析2026年合肥AI大模型开发调试培训,哪家性价比高? - myqiye
  • NMN哪个牌子效果好?2026年NMN十大品牌深度横评:技术代差决定逆龄成效 - 资讯焦点
  • 给Pikachu靶场换个‘皮肤’:实战前端源码分析与简易UI美化教程
  • 从零到亿:当你的AI应用数据量暴涨时,如何用Milvus搞定分布式向量检索与混合查询?
  • 避坑指南:CentOS 7.9离线部署雷池WAF时,docker-compose插件报错‘unknown flag -d’的完整解决过程
  • 别再硬画流程图了!用Vue-Super-Flow插件,5分钟搞定在线考试系统的拖拽填空题
  • Mac NTFS写入权限解决方案:Free-NTFS-for-Mac全功能实现指南
  • 闲置2326开头沃尔玛卡别再吃灰!4个实用回收法帮你盘活资金 - 猎卡回收公众号
  • 经常出差,有没有不用熨烫也能挺括的衬衫?这一篇给你讲清楚 - 中媒介
  • 终于搞懂Nginx反向代理!宝塔面板手把手配置,性能安全双提升!
  • Switch大气层系统终极指南:从零开始到精通使用的完整教程
  • 什么是字段,什么是键
  • 2026年廊坊舒适全屋定制批量定制门店价格如何,梵木里费用盘点 - 工业品牌热点
  • NeRF与3D Gaussian Splatting对比指南:渲染公式差异与性能优化实战
  • C语言编码规范对比:谷歌vs其他主流公司的命名和风格差异
  • SpringBoot+Mybatis多数据源实战:TDengine与MySQL混搭的物联网数据存储方案
  • GLM-5.1 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路
  • 【仅限首批内测用户开放】Polars 2.0清洗性能调优白皮书:含12个未公开API、3类CPU亲和性绑定策略
  • 保姆级教程:GLM-4.6V-Flash-WEB环境配置与一键推理脚本使用
  • Ubuntu 20.04内核更新后WiFi罢工?AX211网卡用户必看的降级指南
  • Hunyuan-MT-7B翻译神器:网页界面零代码操作,支持民汉翻译
  • Typora风格技术文档创作:集成SenseVoice-Small实现语音速记
  • 2026年母婴/宝宝/云朵二代/无风感空调品牌推荐:美的空调技术解析与多场景适配指南 - 品牌推荐官
  • 说说上海欧集雪茄柜定制,它在江浙沪地区品牌靠谱吗? - 工业设备
  • NanoClaw与Web技术结合:前端开发实战
  • 拯救你的RStudio Server:除了点‘Terminate R’,你还可以试试这几招(附原理)
  • 量化投资数据接口新选择:MOOTDX让股票数据获取触手可及