架构设计 - 本地热点缓存

摘要:

缓存体系架构:

一级缓存:JVM本地缓存

二级缓存:Redis集中缓存

三级缓存:Nginx缓存(Proxy Cache缓存;Lua缓存)

Java(或任何编程语言)中的本地热点缓存(通常指的是本地缓存,如使用Guava Cache、EhCache、Caffeine等库实现的缓存,或者简单的HashMap/ConcurrentHashMap作为缓存)在性能优化中起着至关重要的作用。以下是为什么Java(以及许多其他系统和应用)需要本地热点缓存的几个主要原因:

减少数据库或远程服务调用

  • 当应用需要频繁访问数据库或远程服务来获取数据时,这些调用可能会成为性能瓶颈。本地缓存允许应用存储常用数据,并在需要时直接从缓存中获取,而不是每次都进行远程调用。

降低网络延迟

  • 对于分布式系统,远程服务调用通常涉及网络延迟。本地缓存可以显著减少这些延迟,因为数据直接从本地内存中获取。

提高响应速度

  • 由于数据是从本地内存中检索的(比从磁盘或网络获取要快得多),因此应用可以更快地响应请求。

减轻数据库压力

  • 通过减少数据库查询,本地缓存可以帮助减轻数据库服务器的负载,使其能够更有效地处理其他请求。

实现一致性策略

  • 本地缓存允许应用实现更复杂的一致性策略,如最终一致性,同时保持高性能。

缓存热点数据

  • 在许多应用中,存在所谓的“热点数据”,即被频繁访问的数据。本地缓存可以确保这些热点数据始终在内存中,从而加速访问。

支持事务和并发

  • 一些缓存库(如Guava Cache和Caffeine)提供了对事务和并发的支持,确保在多线程环境中缓存的正确性和性能。

缓存失效和更新

  • 本地缓存通常具有失效策略(如基于时间或基于访问的失效)和更新策略(如写穿、写回或刷新),以确保缓存中的数据与数据源保持一致。

减少资源消耗

  • 虽然缓存本身会消耗一些内存,但它通常可以显著减少CPU和网络资源的消耗,因为应用不需要频繁地进行远程调用或执行复杂的计算。

易于实现和集成

  • Java提供了许多易于使用和集成的缓存库和框架,使得在应用中实现本地缓存变得相对简单。

总之,本地热点缓存是优化Java应用性能的重要工具之一,它可以帮助应用更快地响应请求、减轻数据库压力、降低网络延迟,并提高整体系统的可扩展性和可靠性。

基于 google guava 实现的本地热点缓存示例

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.time.Duration;
import java.util.concurrent.Executors;

/**
 * @desc 本地热点缓存 Cache 工具类
 *
 */
public class CacheUtils {

    /**
     * 构建异步刷新的 LoadingCache 对象
     *
     * @param duration 过期时间
     * @param loader  CacheLoader 对象
     * @return LoadingCache 对象
     */
    public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
        return CacheBuilder.newBuilder()
                // 设置缓存窗口初始容量为10
                .initialCapacity(10)
                // 设置缓存中存储的KEY超过100个后按照LRU策略移除
                .maximumSize(100)
                // 只阻塞当前数据加载线程,其他线程返回旧值
                .refreshAfterWrite(duration)
                // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程
                .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool()));
    }

    /**
     * 构建同步刷新的 LoadingCache 对象
     *
     * @param duration 过期时间
     * @param loader  CacheLoader 对象
     * @return LoadingCache 对象
     */
    public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {
        return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

营赢盈英

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值