Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐)

下面我将详细讲解 Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐)的攻略。

背景

在 Spring Boot 2.x 版本中,默认使用的是 Caffeine 作为本地缓存框架,而在之前的版本中,默认使用的是 Guava,这是因为,Caffeine 有更好的性能和更多的特性。

步骤

下面是使用 Caffeine 缓存的基本步骤:

添加依赖

首先,我们需要添加以下依赖到我们的 pom.xml 文件中:

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

创建缓存

接下来,我们需要创建一个缓存对象:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

public class CacheDemo {

    public static void main(String[] args) {
        Cache<String, String> cache = Caffeine.newBuilder()
                .maximumSize(100)
                .build();

        String key = "foo";
        String value = "bar";
        cache.put(key, value);

        System.out.println(cache.getIfPresent(key));
    }
}

代码解释:

  • 我们使用 Caffeine.newBuilder() 方法来创建一个新的缓存对象;
  • 我们通过 maximumSize(100) 方法限制了最大元素数量为 100;
  • 我们通过 build() 方法来构建最终的缓存对象;
  • 我们使用 put(key, value) 方法将一个键值对存入缓存中;
  • 我们使用 getIfPresent(key) 方法获取指定键的值。

缓存配置

除了基本的配置以外,Caffeine 还提供了很多其他的配置选项,比如过期时间、刷新时间等等。下面是一个使用了一些配置选项的例子:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

public class CacheDemo {

    public static void main(String[] args) throws Exception {
        Cache<String, String> cache = Caffeine.newBuilder()
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .expireAfterAccess(30, TimeUnit.SECONDS)
                .maximumSize(100)
                .recordStats()
                .build();

        String key = "foo";
        String value = "bar";

        // 缓存未命中时,调用 load 方法获取数据
        Function<String, String> loader = k -> value.toUpperCase();
        String result = cache.get(key, loader);
        System.out.println(result);

        // 等待 2 分钟,超时后缓存被清空,所以这里又会调用 loader() 方法
        Thread.sleep(TimeUnit.MINUTES.toMillis(2));
        result = cache.get(key, loader);
        System.out.println(result);

        // 输出缓存命中统计信息
        System.out.println(cache.stats());
    }
}

代码解释:

  • 我们使用 expireAfterWrite(1, TimeUnit.MINUTES) 方法来配置缓存条目在写入后留在缓存中的时间;
  • 我们使用 expireAfterAccess(30, TimeUnit.SECONDS) 方法来配置缓存条目的访问时间;
  • 我们使用 maximumSize(100) 方法来限制缓存最大元素数量为 100;
  • 我们使用 recordStats() 方法来记录缓存的统计信息;
  • 当从缓存中获取数据时,如果缓存未命中,会调用我们定义的 loader 方法来获取数据;
  • 每次获取数据时,如果数据在缓存中已经过期,则会自动调用 loader 方法来刷新缓存;
  • 我们使用 cache.stats() 方法来获取缓存的统计信息。

示例

下面是一个使用 Caffeine 缓存的 Spring Boot 示例:

添加依赖

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

缓存配置

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCache helloWorldCache = buildCache("helloWorldCache", 10, 5);

        SimpleCacheManager manager = new SimpleCacheManager();
        manager.setCaches(List.of(helloWorldCache));

        return manager;
    }

    private CaffeineCache buildCache(String name, int maxSize, int expireAfterAccessInMinutes) {
        Cache<Object, Object> cache = Caffeine.newBuilder()
                .maximumSize(maxSize)
                .expireAfterAccess(expireAfterAccessInMinutes, TimeUnit.MINUTES)
                .build();

        return new CaffeineCache(name, cache);
    }
}

代码解释:

  • 我们使用 @EnableCaching 注解开启缓存功能;
  • 我们通过 cacheManager() 方法创建一个缓存管理器;
  • 我们通过 buildCache() 方法创建一个缓存对象;
  • 我们使用 CaffeineCache 类包装我们创建的 cache 对象;
  • 我们根据需要创建多个缓存对象,并将它们存储到 SimpleCacheManager 对象中。

缓存使用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private CacheManager cacheManager;

    @Cacheable(cacheNames = "helloWorldCache", key = "#userId")
    public String getUserById(String userId) {
        // 假装从数据库中获取数据
        return "User-" + userId;
    }

    public void printCacheStats() {
        Cache cache = cacheManager.getCache("helloWorldCache");
        System.out.println(cache.getNativeCache().stats());
    }
}

代码解释:

  • 我们通过 @Cacheable 注解将一个方法设置为可缓存的;
  • 我们使用 cacheNames 属性指定使用的缓存名称;
  • 我们使用 key 属性指定缓存的键;
  • 当访问带有 @Cacheable 注解的方法时,会首先检查缓存,如果找到了对应的值,则直接返回,否则调用方法获取数据,并将数据存入缓存中;
  • 我们可以使用 cacheManager.getCache("helloWorldCache") 方法获取缓存对象,并使用 cache.getNativeCache().stats() 方法获取缓存的统计信息。

总结

在 Spring Boot 2.x 版本中,我们推荐使用 Caffeine 作为本地缓存框架。使用 Caffeine 缓存,我们可以非常方便地创建、配置和使用缓存对象。同时,Caffeine 还提供了很多实用的特性,比如过期时间、统计信息等等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java — 线程(二)

    死锁 死锁是指两个或两个以上的线程在执行过程中,由于竞争同步锁而产生的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁。 死锁的案例 : 同步代码块的嵌套创建锁对象: public class Lock { public static final Lock lockA = new L…

    Java 2023年4月17日
    00
  • java实现双色球抽奖算法

    下面我将为您详细讲解如何使用Java实现双色球抽奖算法: 1. 双色球抽奖算法的基本规则 双色球彩票是一种常见的彩票类型,它由红球号码和蓝球号码组成。具体规则如下: 红球号码区:33个号码中选择6个号码,每个号码在1-33之间。 蓝球号码区:16个号码中选择1个号码,每个号码在1-16之间。 2. 抽奖算法的实现步骤 双色球抽奖算法的实现步骤如下: 2.1 …

    Java 2023年5月27日
    00
  • Java详细分析连接数据库的流程

    下面我将详细讲解Java连接数据库的流程,包括以下几个部分: 导入数据库驱动 建立数据库连接 创建执行SQL语句的对象 执行SQL语句 处理结果集 关闭连接 接下来我们逐个步骤进行说明,同时提供两个代码示例: 1. 导入数据库驱动 在Java中连接数据库需要使用相应的数据库驱动,不同的数据库对应不同的驱动。例如,连接MySQL数据库需要使用mysql-con…

    Java 2023年5月19日
    00
  • 深入理解Java的Spring框架中的IOC容器

    深入理解Java的Spring框架中的IOC容器 什么是IOC IOC全称 Inversion of Control,即控制反转。它是一种设计模式,用于减少计算机程序的耦合,使程序更加灵活,易于维护和扩展。在计算机程序中,对象之间的关系很密切,一个对象依赖于另一个对象,如果硬编码这些关系,就会造成程序的耦合度很高,不容易维护和扩展。而控制反转就是将这些对象之…

    Java 2023年5月19日
    00
  • jsp中一个页面引入另一个页面的实现代码

    JSP中引入其他页面的主要方式是使用JSP include指令。该指令允许将指定的JSP页面包含在当前的JSP页面中。下面是实现此操作的步骤: 步骤一:创建要包含在另一个页面中的JSP页面。例如,我们要将“header.jsp”文件包含在“index.jsp”文件中。那么我们可以先创建“header.jsp”文件,如下所示: <html> &lt…

    Java 2023年6月15日
    00
  • 如何把本地jar包导入maven并pom添加依赖

    下面是如何把本地jar包导入maven并pom添加依赖的完整攻略: 1. 将本地jar包导入maven仓库 使用本地jar包,我们需要先将其导入maven仓库里面,这样我们才能在pom文件中引用到它。 步骤如下: 打开命令行窗口,进入到本地jar包所在目录 假设本地jar包文件名为example.jar,执行以下命令: shell mvn install:i…

    Java 2023年5月20日
    00
  • SpringBoot整合Drools规则引擎动态生成业务规则的实现

    下面是SpringBoot整合Drools规则引擎动态生成业务规则的实现攻略。 1. 简介 Drools 是一个开源的业务规则管理系统(BRMS)和业务规则引擎(BRE)工具。Drools 可以在 Spring Boot 应用程序中使用,实现动态加载和使用业务规则。 2. 添加依赖 首先需要在项目的 pom.xml 文件中添加以下依赖: <!– sp…

    Java 2023年5月19日
    00
  • Spring Data JPA注解Entity使用示例详解

    Spring Data JPA注解Entity使用示例详解 本文将详细介绍Spring Data JPA注解Entity的使用方法,包括如何定义实体类、如何使用注解配置实体类以及实现一些基本的CRUD操作。下文将通过两个示例演示Spring Data JPA注解Entity的使用方法。 示例一:定义实体类 定义实体类是Spring Data JPA的第一步,…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部