Java实现本地缓存的四种方案(Guava Cache、Caffeine、Ehcach 和Spring Cache)

 更新时间:2024年12月31日 11:04:44   作者:小沈同学呀  
在现代应用程序开发中,缓存是提高性能和响应速度的关键技术之一,Java 提供了多种本地缓存解决方案,每种方案都有其特点和适用场景,本文将介绍四种常见的 Java 本地缓存实现,需要的朋友可以参考下

一、引言

在现代应用程序开发中,缓存是提高性能和响应速度的关键技术之一。Java 提供了多种本地缓存解决方案,每种方案都有其特点和适用场景。本文将介绍四种常见的 Java 本地缓存实现:Guava Cache、Caffeine、Ehcache 和 Spring Cache。

二、Guava Cache

理论介绍

Guava Cache 是 Google Guava 库的一部分,提供了轻量级的本地缓存功能。它具有以下特点:
简单易用:API 设计简洁,易于集成到项目中。
自动回收:支持基于时间或引用的自动回收机制。
并发支持:内置高效的并发控制,适合多线程环境。

实战演示

pom

<dependencies>
    <!-- Guava Cache -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1-jre</version> 
    </dependency>
</dependencies>

示例代码

/**
 * LocalCacheTest
 * @author senfel
 * @version 1.0
 * @date 2024/12/20 17:17
 */
@SpringBootTest
public class LocalCacheTest {


    /**
     * guavaCache
     * @author senfel
     * @date 2024/12/20 17:19
     * @return void
     */
    @Test
    public void guavaCache() throws Exception{
        LoadingCache<String, String> cache = CacheBuilder.newBuilder()
                .maximumSize(100)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String key) {
                        return "Value for " + key;
                    }
                });

        System.out.println(cache.get("key1")); // 输出: Value for key1
    }

三、Caffeine

理论介绍

Caffeine 是一个高性能的本地缓存库,继承了 Guava Cache 的优点并进行了优化。它的特点包括:
高性能:比 Guava Cache 更快,特别是在高并发环境下。
灵活配置:支持多种缓存策略,如 LRU(最近最少使用)、LFU(最不经常使用)等。
内存友好:通过弱引用和软引用来减少内存占用。

实战演示

pom

<dependencies>
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.9.3</version>
    </dependency>
</dependencies>

示例代码

/**
 * caffeineCache
 * @author senfel
 * @date 2024/12/20 17:25
 * @return void
 */
@Test
public void caffeineCache() throws Exception{
    Cache<String, String> cache = Caffeine.newBuilder()
            .maximumSize(100)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build();

    cache.put("key1", "value1");
    System.out.println(cache.getIfPresent("key1")); // 输出: value1
}

四、Ehcache

理论介绍

Ehcache 是一个广泛使用的开源缓存框架,适用于分布式和非分布式环境。它的特点有:
丰富的特性:支持多种缓存策略、持久化、集群等功能。
配置灵活:可以通过 XML 或注解进行配置。
社区活跃:拥有庞大的用户群体和活跃的社区支持。

实战演示

pom

<dependencies>
    <!-- Ehcache 核心库 -->
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.6</version>
    </dependency>
    <!-- Ehcache 的 web 集群分布式缓存的支持 -->
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-web</artifactId>
        <version>2.0.4</version>
    </dependency>
</dependencies>

ehcache.xml

<!-- ehcache.xml -->
<ehcache>
    <cache name="exampleCache"
           maxEntriesLocalHeap="100"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"/>
</ehcache>

示例代码

/**
 * ehcacheCache
 * @author senfel
 * @date 2024/12/20 17:31
 * @return void
 */
@Test
public void ehcacheCache() throws Exception{
    CacheManager cacheManager = CacheManager.create("D:\\workspace\\cce-demo\\src\\main\\resources\\ehcache.xml");
    Ehcache cache = cacheManager.getCache("exampleCache");

    cache.put(new Element("key1", "value1"));
    System.out.println(cache.get("key1").getObjectValue()); // 输出: value1
}

五、Spring Cache

理论介绍

Spring Cache 是 Spring 框架提供的缓存抽象层,可以与多种缓存实现无缝集成。它的特点包括:
声明式缓存:通过注解简化缓存逻辑的实现。
高度集成:与 Spring 生态系统紧密集成,方便与其他组件协同工作。
灵活选择:支持多种缓存提供者,如 ConcurrentMapCache、Ehcache、Caffeine 等。

实战演示

pom

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.9.3</version>
</dependency>

yaml

spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=100,expireAfterWrite=10m

示例代码

/**
 * CacheService
 * @author senfel
 * @version 1.0
 * @date 2024/12/20 17:45
 */
@Service
public class CacheService {

    /**
     * getData
     * @param key
     * @author senfel
     * @date 2024/12/20 17:53
     * @return java.lang.String
     */
    @Cacheable(value = "myCache")
    public String getData(String key) {
        // 模拟耗时操作
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Value for " + key;
    }
}
@Resource
private CacheService cacheService;

/**
 * testCache
 * @param key
 * @author senfel
 * @date 2024/12/20 18:00
 * @return java.lang.String
 */
@RequestMapping("/testCache")
public String  testCache(String key) {
    return  cacheService.getData(key);
}

六、总结

综上所述,Guava Cache 简单易用,自动回收 ,适合小型应用,对性能要求不高;Caffeine高性能,灵活配置 高并发环境,适合对性能敏感的应用;Ehcache功能丰富,配置灵活,适合分布式系统,需要复杂缓存策略;Spring Cache 是声明式缓存,高度集成 ,适合Spring 应用,需要快速集成缓存。在实际的开放中,我们可以根据具体需求选择合适的缓存方案,可以显著提升应用程序的性能和用户体验。

以上就是Java实现本地缓存的四种方案(Guava Cache、Caffeine、Ehcach 和Spring Cache)的详细内容,更多关于Java本地缓存的资料请关注脚本之家其它相关文章!

相关文章

  • Java JSON转成List结构数据

    Java JSON转成List结构数据

    这篇文章主要介绍了Java JSON转成List结构数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Netty进阶之ChannelPoolMap源码解析

    Netty进阶之ChannelPoolMap源码解析

    这篇文章主要介绍了Netty进阶之ChannelPoolMap源码解析,ChannelPoolMap是用来存储ChannelPool和指定key的一个集合Map,实际的应用场景就是服务器端是一个分布式集群服务,拥有多个配置地址,这样我们就可以配置多个服务地址,减轻单台服务器的压力,需要的朋友可以参考下
    2023-11-11
  • spring整合redisson开启缓存方式

    spring整合redisson开启缓存方式

    这篇文章主要介绍了spring整合redisson开启缓存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java之类加载机制案例讲解

    Java之类加载机制案例讲解

    这篇文章主要介绍了Java之类加载机制案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 利用Jackson解析JSON的详细实现教程

    利用Jackson解析JSON的详细实现教程

    JSON对于开发者并不陌生,如今的WEB服务等都是以JSON作为数据交换的格式。学习JSON格式的操作工具对开发者来说是必不可少的。本文将介绍如何使用Jackson开源工具库对JSON进行常见操作,需要的可以参考一下
    2022-07-07
  • 使用Java的Spring框架编写第一个程序Hellow world

    使用Java的Spring框架编写第一个程序Hellow world

    这篇文章主要介绍了Java的Spring框架并用其开始编写第一个程序Hellow world的方法,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • MyBatis中有关int和Integer的使用方式

    MyBatis中有关int和Integer的使用方式

    这篇文章主要介绍了MyBatis中有关int和Integer的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java泛型常见面试题(面试必问)

    Java泛型常见面试题(面试必问)

    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。java泛型知识点也是Java开发岗位必问的一个话题,今天小编就给大家普及下Java泛型常见面试题,感兴趣的朋友一起看看吧
    2021-06-06
  • Java异常学习之自定义异常详解

    Java异常学习之自定义异常详解

    你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。下面这篇文章主要给大家介绍了关于Java异常学习之自定义异常的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • java中的hashCode方法小例子

    java中的hashCode方法小例子

    这篇文章主要介绍了java中的hashCode方法小例子,有需要的朋友可以参考一下
    2013-12-12

最新评论