缓存是提升系统性能、降低数据库压力的重要手段。Java 开发中常用的缓存方案包括 ​本地缓存(如 Caffeine、Guava Cache)​​ 和 ​分布式缓存(如 Redis)​。这两者在设计目标、使用场景、性能特点等方面有显著差异,合理选择和搭配使用它们,能够有效提升系统的响应速度和稳定性。


一、本地缓存与 Redis 缓存的核心区别

对比维度

本地缓存(如 Caffeine、Guava Cache)

Redis 缓存(分布式缓存)

存储位置

应用程序的 JVM 内存中,每个服务实例独立维护

独立部署的缓存服务器(如 Redis),服务共享同一份数据

是否共享

❌ 不共享,各服务实例缓存相互独立,数据不一致

✅ 共享,所有服务节点访问同一个 Redis,数据一致

存储介质

进程内内存(堆内或堆外)

服务器内存(专用缓存服务)

访问速度

 极快,无网络开销,通常是纳秒到微秒级

快,但有一定网络延迟,通常是毫秒级

容量限制

受限于 JVM 堆内存,通常较小

可扩展,支持 GB 甚至 TB 级缓存,取决于 Redis 配置

分布式支持

❌ 不支持,仅限当前服务实例使用

✅ 支持,天然支持分布式部署,多服务共享缓存

数据一致性

❌ 差,多实例间缓存数据可能不同步

✅ 较好,所有服务访问同一缓存源,一致性更强

失效与淘汰策略

支持(如 LRU、LFU),由本地缓存组件控制

支持(如 volatile-lru、allkeys-lru),由 Redis 控制

持久化能力

❌ 一般不支持持久化,服务重启后缓存丢失

✅ 支持 RDB / AOF 持久化,重启后可恢复数据

高可用性

❌ 无,服务崩溃则缓存丢失

✅ 支持主从、哨兵、集群等高可用方案

适用场景

单机/小规模服务,追求极致性能,数据变动少

分布式系统、高并发、多服务共享、需要集中管理缓存


二、本地缓存的特点与适用场景

本地缓存是将数据存储在应用进程内的内存中,读写速度极快,常用于以下场景:

适用场景

  1. 读多写少、数据更新频率低
    • 如系统配置、城市列表、字典表、基础运单信息等。
  2. 2.

    对访问性能要求极高

    • 本地缓存无网络开销,适用于超高性能要求的调用路径。

  3. 服务规模较小或单机部署
    • 比如独立后台服务,不需要多实例间共享缓存。
  4. 作为一级缓存(Cache Aside Pattern)​
    • 与 Redis 配合使用,先查本地缓存,再查 Redis,最后查数据库。

常见框架

  • Caffeine​:目前性能最高的 Java 本地缓存库,支持异步加载、灵活的过期策略,Spring Boot 默认集成。
  • Guava Cache​:Google 提供的本地缓存方案,功能稳定但性能略低于 Caffeine。
  • Ehcache​:功能全面,支持磁盘持久化,但相对重量级,适合复杂场景。

优点

  • 访问速度极快,通常在微秒级甚至纳秒级完成。
  • 无网络开销,部署简单,不依赖外部服务。
  • 适合存储少量、稳定的热点数据。

缺点

  • 各实例缓存数据相互独立,容易导致数据不一致。
  • 缓存容量受限于 JVM 堆内存,不适合存储大量数据。
  • 服务重启后缓存丢失,无法持久化。
  • 不适用于分布式系统中的共享数据场景。

三、Redis 缓存的特点与适用场景

Redis 是一个高性能的分布式内存数据库,常被用作缓存中间件,支持多种数据结构和丰富的功能。

适用场景

  1. 分布式系统 / 微服务架构
    • 多个服务实例共享同一份缓存数据,如用户信息、商品详情等。
  2. 高并发访问
    • Redis 能承受较高的 QPS,适用于高并发场景。
  3. 需要集中管理、统一控制
    • 所有服务访问同一个 Redis,便于管理缓存失效、更新与同步。
  4. 需要高级功能支持
    • 如分布式锁、消息队列、会话共享、计数器、限流等。

常见使用方式

  • 缓存数据库查询结果,减轻 MySQL 等数据库压力。
  • 存储用户 Session、Token,实现无状态服务。
  • 作为分布式锁、全局计数器、排行榜等功能的实现基础。
  • 用作消息队列(如 List、Stream)或延迟队列。

优点

  • 分布式共享,所有服务节点访问同一份数据,一致性强。
  • 访问速度快,支持高并发,性能优异。
  • 功能丰富,支持多种数据结构、过期策略、持久化、Lua 脚本等。
  • 支持高可用部署(主从、哨兵、集群)。
  • 数据可持久化,支持重启恢复。

缺点

  • 访问 Redis 需要经过网络,相比本地缓存有额外延迟。
  • 需要额外部署和维护 Redis 服务,增加系统复杂度。
  • 依赖外部中间件,若 Redis 宕机可能影响业务(可通过集群缓解)。

四、本地缓存与 Redis 的组合使用,多级缓存架构

在实际生产环境中,本地缓存和 Redis 缓存往往是配合使用的,形成 ​多级缓存架构,以兼顾性能和一致性。

典型架构流程

用户请求↓
应用服务↓
① 先查本地缓存(如 Caffeine) —— 速度最快,无网络↓ 未命中
② 再查 Redis 缓存(分布式缓存) —— 数据共享,集中管理↓ 未命中
③ 最后查数据库(如 MySQL) —— 数据源头

优势

  • 本地缓存​:提供极致的读取性能,适合访问频率极高、数据基本不变的场景。
  • Redis 缓存​:作为集中式缓存层,保证多服务间数据一致性,避免缓存穿透。
  • 数据库​:作为最终的数据来源,保证数据准确性和完整性。

应用举例:运单信息查询模块

  • 运单基础信息​(如运单号、状态、地址):查询频繁,数据变更较少,适合使用 ​本地缓存 + Redis
  • 用户会话 / Token​:多服务共享,需集中管理,推荐使用 ​Redis
  • 配置信息 / 枚举数据​:基本不变,可使用 ​本地缓存
  • 秒杀库存、热点数据​:高并发场景,推荐 ​Redis + 本地辅助缓存,并配合防穿透策略。

五、如何选择本地缓存与 Redis

业务需求

推荐方案

追求极致读取性能,数据基本不变,且是单机服务

本地缓存(如 Caffeine)

多服务共享缓存,分布式系统,需要数据一致性

Redis

既要高性能,又要多实例共享,减少对 Redis 的压力

多级缓存(本地 + Redis)

需要缓存大量数据、支持持久化、高可用

Redis

需要分布式锁、消息队列、计数器等高级功能

Redis


六、总结

本地缓存和 Redis 缓存是现代应用开发中不可或缺的技术手段。​本地缓存以极致的性能和简单的部署为特点,适用于单机或小规模服务中的高频访问数据;Redis 缓存凭借其分布式、高可用、功能丰富的特性,成为分布式系统中共享缓存的首选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94569.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94569.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94569.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从“0”开始学JAVA——第十一节 I/O流

在Java编程中&#xff0c;文件操作和输入输出(IO)处理是必不可少的部分。本文将深入探讨Java IO包中的文件流操作&#xff0c;包括基础概念、分类、常用类以及实际应用场景。1. File类File类是Java IO操作的基础&#xff0c;它实现了Serializable和Comparable<File>接口。…

【数据价值化】数据资产入表指南:核心准则与实操路径

随着数据要素市场的蓬勃发展&#xff0c;数据资产的商业价值愈发凸显。然而&#xff0c;如何让数据资产合规、合理地进入企业财务报表&#xff0c;成为众多企业急需解决的难题。本文基于《企业会计准则》的相关规定&#xff0c;为您系统梳理数据资产入表的核心准则要点与实操路…

基于 MediaPipe + Three.js 的实时姿态可视化前端

这是一套前端实时姿态捕获与 3D 可视化的 DEMO&#xff0c;特点是启动快、UI 现代、渲染稳定&#xff0c;同时对设备性能与网络情况做了多处优化。 预览地址 技术栈与核心依赖 框架与工程&#xff1a;Vite React TypeScript实时姿态识别&#xff1a;MediaPipe Tasks Vision&…

【分布式技术】Kafka 数据积压全面解析:原因、诊断与解决方案

Kafka 数据积压全面解析&#xff1a;原因、诊断与解决方案Kafka 数据积压深度解析与解决方案全景指南一、数据积压核心原因矩阵二、生产者侧问题深度解析1. 突发流量洪峰2. 大消息阻塞管道三、消费者侧问题深度解析1. 消费能力不足2. 消费逻辑阻塞四、Broker集群问题深度解析1.…

企业云办公安全指南:如何构建高效无忧的云办公环境?

2025年&#xff0c;全球化协作与混合办公已成为企业运营的常态。越来越多的企业将业务迁移至云端&#xff0c;云办公在提升灵活性与效率的同时&#xff0c;也带来了新的安全挑战——数据泄露、内部威胁、网络攻击等风险无处不在&#xff0c;每一个环节都可能成为企业核心资产的…

Thingsboard 租户管理员权限,增加租户普通用户权限

在 ThingsBoard CE&#xff08;社区版&#xff09;中&#xff0c;租户管理员拥有对规则链、客户、资产、设备、仪表板等资源的全面管理权限。如果你想为租户创建一个普通用户&#xff0c;并限制其不能操作规则链、高级功能、安全设置等&#xff0c;可以通过以下步骤实现&#x…

【笔记】大模型业务场景流程综述

前言 大模型是指具有大规模参数和复杂计算结构的深度学习模型,这些模型通常由众多神经网络构建而成,拥有数十亿甚至数千亿个参数。本章将围绕大模型概念及特点展开,介绍模型算法的分类、典型大模型及应用、大模型训练流程和大模型业务流程。 目标 学完本课程后,您将能够…

【两数相互求余等于输入两数】2022-10-20

缘由关于#c#的问题&#xff1a;这个应该按照怎么个思路来写&#xff1a;想老半天莫得思路想法-编程语言-CSDN问答 void 两数相互求余等于输入两数() {//缘由https://ask.csdn.net/questions/7813625int a 0, b 0, x 0, y 0;cin >> a >> b;if (a > b)x a, y…

Linux系统调优

目录 1.CPU 负载查看 1.1.使用 uptime 查看系统负载 1.2.使用 top 按 CPU 使用率排序 1.3.使用 ps 查看 CPU 使用最多的进程 1.4.使用 mpstat 查看 CPU 详细状态 1.5.查看 /proc/meminfo 获取详细内存信息 2查看内存运行状态 2.1.使用 free 查看内存使用 1.CPU 负载查看…

AtCoder Beginner Contest 420

比赛链接如下&#xff1a; AtCoder Beginner Contest 420 - AtCoder A - What month is it? Problem Statement You are given integers X and Y between 1 and 12, inclusive. Find what month it will be Y months after month X (for example, month 1 is January). Cons…

Python算法-贪心算法(Greedy Algorithm)

Python算法&#xff1a;贪心算法&#xff08;Greedy Algorithm&#xff09;深度解析 引言 贪心算法&#xff08;Greedy Algorithm&#xff09;是计算机科学中最基础的算法设计思想之一&#xff0c;其核心在于通过局部最优选择逐步构建全局最优解。尽管它并不总能保证得到绝对最…

告别臃肿与广告:精选9款安卓电视桌面Launcher,还你清爽高效体验 (2025版)

[实测] 9款优秀安卓电视桌面Launcher推荐&#xff1a;告别原生臃肿&#xff0c;重塑清爽TV体验 引言&#xff1a;当前智能电视桌面的痛点 目前市面上许多智能电视或电视盒子的原生桌面&#xff08;Launcher&#xff09;系统&#xff0c;为了商业推广和内容聚合&#xff0c;往…

Docker Desktop紧急修复CVSS9.3高危容器逃逸漏洞

Docker公司修复了Windows和macOS版Docker Desktop应用程序中的一个高危漏洞&#xff08;CVE-2025-9074&#xff0c;CVSS评分9.3&#xff09;&#xff0c;攻击者可能利用该漏洞突破容器隔离限制。漏洞技术细节根据Docker官方文档披露&#xff0c;恶意容器能够访问Docker引擎并在…

携程旅游的 AI 网关落地实践

原创 董艺荃 Higress 2025年08月21日 16:32 陕西本文整理自携程旅游研发总监董艺荃在2025中国可信云大会上的分享&#xff0c;董艺荃 GitHub ID CH3CHO&#xff0c;同时也是 Higress 的 Maintainer。分享内容分为以下4部分。01 大规模应用 AI 技术过程中遇到了哪些问题02 网关…

CloudBase云开发MCP + CodeBuddy IDE:打造智能化全栈理财助手的完整实践

CloudBase云开发MCP CodeBuddy IDE&#xff1a;打造智能化全栈理财助手的完整实践 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#x…

ESP8266学习

一&#xff0c;连接Wifi1.Esp8266连接手机热点ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"手机查看连接信息2.Esp8266连接手机热点进入透传模式ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"ATCIPMUX0 ATCIPSTART"TCP&qu…

Mac安装mitmproxy及操作对监控的请求

在 macOS 上安装和配置 mitmproxy 是一个相对简单的过程&#xff0c;可以使用常见的包管理工具如 Homebrew 或直接通过 Python 的包管理工具 pip。以下是详细的安装步骤&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…

c++ 数据结构-堆、优先队列 小总结

之前学习了一些堆、优先队列的知识点&#xff0c;在此做一个小总结。堆&#xff08;Heap&#xff09;堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树数据结构&#xff0c;具有以下重要特性&#xff1a;结构特性堆是一棵完全二叉树&#xff0c;即除了最后一层外&#xf…

编写Linux下usb设备驱动方法:probe函数中要进行的工作

一. 简介 前一篇文章简单学习了 Linux下usb设备驱动实现流程&#xff0c;文章如下&#xff1a; 编写Linux下usb设备驱动方法&#xff1a;usb设备驱动实现流程-CSDN博客 本文来学习一下 usb设备驱动的 probe函数要完成的任务。 当usb主控制器检测到设备与 驱动相匹配时&…

动态规划:为什么暴力算法会有重复子问题

第一步&#xff1a;先明确 “子问题” 和 “重复子问题” 的定义 在算法中&#xff0c;“子问题” 不是泛指 “小一点的问题”&#xff0c;而是具有明确 “状态参数” 的、可独立求解的问题单元。 状态参数&#xff1a;描述子问题核心信息的变量&#xff08;比如 01 背包中的 “…