springboot 整合Caffeine项目中使用介绍

java接口的查询如何能提高性能,比每次都去数据库中查询要快的方案有了,就是下面要介绍的。

一、添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>

二、启动类上添加注解

@org.springframework.cache.annotation.EnableCaching

三、配置

 1、采用spring自带配置

############# 缓存配置 不推荐  建议自定义 #############
spring.cache.cache-names=USER,ADVERT
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=30s,refreshAfterWrite=7s
spring.cache.type=caffeine

2、自定义配置

 /**
 * <p> 缓存名分类 </p>
 */
public enum CacheNameEnum {
 
    /**
     * 用户
     */
    USER(5, 20L, 60L),
    /**
     * 推荐
     */
    ADVERT(5, 10L, 120L);
 
    private final Integer initialCapacity;
    private final Long maximumSize;
    private final Long expire;
 
    CacheNameEnum(Integer initialCapacity, Long maximumSize, Long expire) {
        this.initialCapacity = initialCapacity;
        this.maximumSize = maximumSize;
        this.expire = expire;
    }
 
    public Long getMaximumSize() {
        return maximumSize;
    }
 
    public Integer getInitialCapacity() {
        return initialCapacity;
    }
 
    public Long getExpire() {
        return expire;
    }
}
import com.coocaa.system.enums.CacheNameEnum;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
 
/**
 * @author songjianyong
 * <p> 本地缓存配置 </p>
 */
@Configuration
public class CaffeineCacheConfig {
    private static final SimpleCacheManager SIMPLE_CACHE_MANAGER = new SimpleCacheManager();
 
    @Bean
    public CacheManager caffeineCacheManager() {
 
        List<CaffeineCache> caches = new ArrayList<>();
 
        for (CacheNameEnum value : CacheNameEnum.values()) {
 
            com.github.benmanes.caffeine.cache.Cache<Object, Object> cache = Caffeine.newBuilder()
                    .initialCapacity(value.getInitialCapacity())
                    .maximumSize(value.getMaximumSize())
                    //写入后失效时间
                    .expireAfterWrite(Duration.ofSeconds(value.getExpire()))
                    .build();
 
            caches.add(new CaffeineCache(value.name(), cache));
        }
 
        SIMPLE_CACHE_MANAGER.setCaches(caches);
 
        return SIMPLE_CACHE_MANAGER;
    }
 
}

四、使用注解

@org.springframework.cache.annotation.Cacheable(value = "USER", key="#p0.id")

五、进阶处理

自定义 CaffeineCacheManager

import com.coocaa.ops.admin.common.enums.CacheNameEnum;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.CacheLoader;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * 自定义 CaffeineCacheManager
 *
 * @author songjianyong
 */
@Configuration
public class SongCaffeineCacheManager extends CaffeineCacheManager implements InitializingBean {
    private final Map<String, Caffeine<Object, Object>> builders = new HashMap<>();
    @Nullable
    private CacheLoader<Object, Object> cacheLoader;
 
    @Override
    public void afterPropertiesSet() throws Exception {
        for (CacheNameEnum value : CacheNameEnum.values()) {
            builders.put(value.getCacheName(), Caffeine.from(value.getSpec()));
        }
    }
 
    @Override
    @NonNull
    protected Cache<Object, Object> createNativeCaffeineCache(@NonNull String name) {
        Caffeine<Object, Object> builder = builders.get(name);
        if (builder == null) {
            return super.createNativeCaffeineCache(name);
        }
 
        if (this.cacheLoader != null) {
            return builder.build(this.cacheLoader);
        } else {
            return builder.build();
        }
    }
 
    @Override
    public void setCacheLoader(@NonNull CacheLoader<Object, Object> cacheLoader) {
        super.setCacheLoader(cacheLoader);
        this.cacheLoader = cacheLoader;
    }
}

辅助代码

/**
 * 缓存名称枚举
 *
 * @author songjianyong
 */
public enum CacheNameEnum {
    /**
     * 接口响应结果缓存名称
     */
    SONG_API_RESPONSE("SONG:API:RESPONSE", "initialCapacity=5,maximumSize=50,expireAfterWrite=1d"),
    JIAN_API_RESPONSE("JIAN:API:RESPONSE", "initialCapacity=10,maximumSize=100,expireAfterWrite=15d");
 
    /**
     * 缓存名称
     */
    private final String cacheName;
    /**
     * spec
     */
    private final String spec;
 
    CacheNameEnum(String cacheName, String spec) {
        this.cacheName = cacheName;
        this.spec = spec;
    }
 
    public String getCacheName() {
        return cacheName;
    }
 
    public String getSpec() {
        return spec;
    }
}

补充下注解:

  • @Cacheable:表示该方法支持缓存。当调用被注解的方法时,如果对应的键已经存在缓存,则不再执行方法体,而从缓存中直接返回。当方法返回null时,将不进行缓存操作。
  • @CachePut:表示执行该方法后,其值将作为最新结果更新到缓存中,每次都会执行该方法。
  • @CacheEvict:表示执行该方法后,将触发缓存清除操作。
  • @Caching:用于组合前三个注解,例如:
@Caching(cacheable = @Cacheable("CacheConstants.GET_USER"),
         evict = {@CacheEvict("CacheConstants.GET_DYNAMIC",allEntries = true)}
public User find(Integer id) {
    return null;
}
  • cacheNames/value:缓存组件的名字,即cacheManager中缓存的名称。
  • key:缓存数据时使用的key。默认使用方法参数值,也可以使用SpEL表达式进行编写。
  • keyGenerator:和key二选一使用。
  • cacheManager:指定使用的缓存管理器。
  • condition:在方法执行开始前检查,在符合condition的情况下,进行缓存
  • unless:在方法执行完成后检查,在符合unless的情况下,不进行缓存
  • sync:是否使用同步模式。若使用同步模式,在多个线程同时对一个key进行load时,其他线程将被阻塞。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot可以很方便地整合Caffeine缓存。Caffeine是一个高性能的Java缓存库,可以用于减少应用程序的响应时间和提高性能。在Spring Boot,可以使用Spring Cache抽象来集成Caffeine缓存。只需在pom.xml文件添加Caffeine依赖项,然后在应用程序配置缓存管理器即可。可以使用@Cacheable注释来标记需要缓存的方法,并在需要时自动从缓存获取数据。此外,还可以使用@CachePut注释来更新缓存的数据,以及@CacheEvict注释来删除缓存的数据。整合Caffeine缓存可以显著提高应用程序的性能和响应时间,特别是在处理大量数据时。 ### 回答2: Spring Boot是目前非常流行的基于Java的开源框架,主要用于在Web应用程序创建应用程序,而Caffeine是一种基于Java的本地缓存框架,可以有效地提高应用程序的性能。在本文,我们将讨论如何使用Spring BootCaffeine整合到我们的应用程序Caffeine是一个类似于Guava缓存的本地缓存框架,但它在性能和代码大小方面更优。Caffeine使用基于内存的缓存,其对象在缓存以键值对的形式存储。当需要缓存对象时,应用程序将其存储在缓存。下次应用程序需要访问缓存对象时,Caffeine将在缓存查找该对象,而无需重新计算或访问磁盘。 使用Spring Boot整合Caffeine,我们需要执行以下步骤: 1.添加Caffeine依赖 我们需要在应用程序添加Caffeine Maven或Gradle依赖项。以下是Maven依赖项的示例: ``` <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.8.5</version> </dependency> ``` 2.创建Caffeine缓存 在Spring Boot应用程序创建Caffeine缓存是非常简单的。我们可以使用Caffeine类来创建缓存,并指定缓存的属性和采用的策略。以下是创建基本缓存的示例: ``` import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.concurrent.ConcurrentMapCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("cacheName"); } } ``` 在上面的示例,我们创建了一个名为“cacheName”的缓存。我们还启用了Spring Boot的缓存支持@EnableCaching。 3.将Caffeine缓存用于方法 现在,我们已经创建了一个Caffeine缓存,可以在我们的应用程序使用它。我们可以使用Spring Boot注释将缓存添加到我们的方法,以便它们能够使用缓存数据而不是重复计算。以下是使用Caffeine缓存的方法示例: ``` @Cacheable(value = "cacheName", key = "#key") public Object getObject(String key) { // Some operations to fetch the object } ``` 在上面的示例,我们使用@Cacheable注释将getObject()方法添加到缓存。我们还指定了“cacheName”作为缓存的名称。 综上所述,Spring BootCaffeine整合是一种简单但有效的缓存解决方案。我们可以使用它轻松地将本地缓存添加到我们的应用程序,以提高应用程序的性能和效率。 ### 回答3: Spring Boot是目前最为流行的Java Web开发框架之一,而Caffeine则是一种高效的Java缓存库,它可以将缓存对象存储在本地内存,从而提高应用程序的性能。 如果将Spring BootCaffeine进行整合,就能够进一步提高应用程序的性能和效率。下面是整合的详细步骤: 第一步:添加Maven依赖 在Spring Boot应用程序的pom.xml文件添加以下依赖: ``` <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>${caffeine.version}</version> </dependency> ``` 注意,需要将${caffeine.version}替换成实际的Caffeine版本号。 第二步:创建Caffeine缓存配置类 创建一个带有@Configuration注解的Java类,用于定义Caffeine缓存的配置和属性。 ``` @Configuration @EnableCaching public class CaffeineConfig { @Bean public Caffeine<Object, Object> caffeineConfig() { return Caffeine.newBuilder() .maximumSize(100) .expireAfterAccess(10, TimeUnit.MINUTES); } @Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(caffeineConfig()); return cacheManager; } } ``` 在这个类,我们使用了@EnableCaching注解来启用Spring的缓存支持。在@Bean注解下,我们定义了基本的Caffeine缓存配置。这里我们设置了最大缓存数为100个,缓存失效时间为10分钟。接着,我们使用@Bean注解创建一个缓存管理器实例,并将Caffeine配置传递给它。 第三步:定义目标缓存方法,并在方法上添加缓存注解 定义Spring应用程序的缓存逻辑方法,并在该方法上添加@Cacheable注解。这个注解可以用来告诉Spring将结果存储在缓存,以便后续请求可以更快地检索结果。 ``` @Service public class UserServiceImpl implements UserService { @Override @Cacheable(value = "users", key = "#id") public User getUserById(Long id){ //从数据库获取用户 return userDao.getUserById(id); } } ``` 在这个示例,通过@Cacheable注解,getUserById()方法的结果将被存储在名为users的缓存。缓存的键值是方法的输入参数id。 总结 Spring Boot整合Caffeine非常简单。只需添加Maven依赖、创建Caffeine缓存配置类和添加缓存注解,就可以在Spring应用程序实现高效的缓存处理。这种缓存处理可以非常好地提高应用程序的性能和效率,从而更好地满足用户需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值