Java 中的缓存机制

17 Mar 2025 | 6 分钟阅读

缓存是将数据存储在内存(缓存内存)中并从中访问数据的过程。缓存的主要特点是减少访问特定数据的时间。缓存的目标是存储将来可能有所帮助的数据。缓存的原因是,从持久内存(如 HDD、SDD 的硬盘驱动器)访问数据曾经需要大量时间,从而减慢了过程。

因此,缓存减少了从内存中获取数据的时间。缓存用于存储高速数据存储层,其目的是减少访问数据存储层的需求。缓存通常由快速访问硬件(RAM)实现。

缓存使得重用先前计算数据的机制成为可能。每当硬件或软件请求特定数据时,都会首先在缓存中搜索请求的数据,如果找到数据则发生缓存命中,如果未找到数据则发生缓存未命中。

为什么缓存很重要?

  • 它在提高系统性能方面发挥着至关重要的作用。
  • 它减少了总时间,并使系统在时间上高效,因为它将数据本地存储。
  • 缓存是不可避免的,因为它为计算机技术提供了高性能。
  • 它通常不会产生新的请求。
  • 它避免了数据的重复处理。

缓存内存的用例

  • 主要缓存用于加速数据库应用程序。在这里,数据库的一部分被缓存替换,结果是消除了频繁访问数据时出现的延迟。当访问数据量较大时,例如高流量的动态网站,就会出现这些用例。
  • 另一个用例可以是查询加速。在这里,缓存用于存储复杂查询的结果。例如,排序和分组等查询需要大量执行时间。如果重复执行查询,则使用缓存存储结果可以获得更高的响应。

缓存机制如何工作?

Java 对象缓存管理进程内、进程间或本地磁盘中的 Java 对象。Java 对象缓存提供了一个强大、灵活且易于使用的服务,通过管理 Java 对象的本地副本,显著提高了 Java 性能。对可以缓存的 Java 对象类型或对象的原始来源的限制非常少。程序员可以使用 Java 对象缓存来管理那些如果不访问缓存则检索或创建成本高昂的对象。

Caching Mechanism in Java

Java 对象缓存易于集成到新旧应用程序中。可以使用用户定义的缓存加载器(CacheLoader)将对象加载到对象缓存中,并通过缓存访问对象(CacheAccess object)进行访问。缓存访问对象支持本地和分布式对象管理。Java 对象缓存的大部分功能不需要管理或配置。高级功能支持使用 Cache 类中的管理应用程序接口(API)进行配置。管理包括设置配置选项,例如命名本地磁盘空间或定义网络端口。管理功能允许应用程序完全集成 Java 对象缓存。

每个缓存的 Java 对象都有一组相关的属性,这些属性控制对象如何加载到缓存中、对象存储在哪里以及对象如何失效。缓存对象基于时间或显式请求失效(在对象失效时可以提供通知)。对象可以按组或单独失效。

缓存类型

  • 数据库缓存:数据库中已存在一定级别的缓存。此内部缓存用于避免重复查询。数据库可以立即提供最后执行的查询结果。最常用的数据库缓存算法基于在哈希表中存储键值对。
  • 内存缓存:RAM 直接用于存储缓存数据,此方法比常见的数据库存储系统(硬盘驱动器)更快。此方法基于数据库中的一组键值对。值是缓存的数据,键是唯一值。每个集合都唯一标识。它快速、高效且易于实现。
  • Web 缓存:它分为 2 部分
    1. Web 客户端缓存:此缓存方法在客户端,并且是所有互联网用户常用的。也称为 Web 浏览器缓存。当浏览器加载网页时,它会开始累积页面资源,例如图像、文本、媒体文件和脚本。当访问同一页面时,浏览器可以从缓存中获取资源。它比从互联网下载更快。
    2. Web 服务器缓存:在这里,资源保存在服务器端,旨在重用资源。此方法对于动态网页很有用,对于静态网页可能不那么有用。它减少了服务器的过载,减少了工作量,并提高了页面交付速度。
  • CDN 缓存:内容分发网络(CDN)缓存旨在缓存脚本、样式表、媒体文件和网页等代理服务器中的资源。它充当源服务器和用户之间的网关。当用户请求资源时,代理服务器会介入以确定它是否拥有副本。如果找到了资源的副本,则将其传输给用户;否则,由源服务器处理请求。它消除了网络延迟并减少了对源服务器的调用。

缓存的挑战

  • 本地缓存:可能会出现缓存一致性问题,因为本地缓存的资源在系统之间分布不均,这个过程可能会降低缓存效率。
  • 缓存一致性问题:当一个处理器修改其在多个缓存之间共享的数据的本地副本时,使多个本地缓存保持同步顺序就成了一个挑战。
  • 缓存穿透:当用户查询数据时,请求首先发送到缓存,如果缓存中存在所需数据,则发送给用户;但如果缓存中没有此类数据,请求将重新传输到主内存,如果主内存中也不存在该数据,则结果将为 NULL,从而导致缓存穿透。这个问题可以通过使用布隆过滤器来解决。
  • 缓存雪崩:如果缓存同时发生故障,而用户又发出大量查询,数据库将承受巨大的压力,可能导致数据库崩溃。这个问题可以通过使用缓存集群和 Hystrix 来解决。

缓存的优点

  • 缓存减少了处理查询所需的时间;缓存最大限度地减少了请求相同数据的往返次数。
  • 缓存减少了服务器上的负载。
  • 缓存提高了系统硬件的效率。
  • 借助缓存,网页下载/渲染速度得到提高。

缓存的缺点

  • 缓存算法难以实现且复杂。
  • 缓存增加了应用程序的复杂性。
  • 维护成本高。

缓存的应用

缓存机制应用于以下行业

  • 健康与保健:通过有效的缓存架构,我们将能够实现快速的速度,节省总体支出,并随着使用量的增长而扩展。
  • 广告技术:在开发实时竞价软件时,毫秒之差可能意味着能否及时出价,以及出价是否变得无关紧要。这需要从数据库中闪电般地检索出价信息。数据库缓存,可以在毫秒或更短时间内检索出价数据,是实现如此高速度的绝佳方式。
  • 移动端:通过适当的缓存解决方案,我们的移动应用程序可以实现消费者所需的性能,呈指数级增长,并降低您的总成本。
  • 游戏和媒体:缓存通过为常用数据提供亚毫秒级的查询响应,帮助游戏顺畅运行。
  • 电子商务:精心执行的缓存管理是响应时间的战略组成部分,这可以成为促成销售与失去客户之间的关键区别。

结论

Java 应用程序中的缓存机制是增强性能、减少资源消耗和改善用户体验的强大工具。通过选择正确的缓存策略、实现缓存策略和遵循最佳实践,我们可以有效地将缓存集成到我们的 Java 应用程序中。审慎使用缓存可以改变游戏规则,优化 Java 应用程序的性能,使其更快、更高效,并最终更用户友好。