Java高性能缓存框架之Caffeine详解

 更新时间:2023年12月29日 08:32:23   作者:_Romeo  
这篇文章主要介绍了Java高性能缓存框架之Caffeine详解,Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美,Caffeine受启发于Guava Cache的API,使用API和Guava是一致的,需要的朋友可以参考下

Caffeine缓存框架

Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美。

Caffeine受启发于Guava Cache的API,使用API和Guava是一致的。

它借鉴了Guava Cache和ConcurrentLinkedHashMap的设计经验。

在Springboot中使用Caffeine

在工程的pom文件引入caffeine的依赖,如下:

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

创建一个抽象类AbstractCaffineCache,该类使用范型来约束缓存的数据类型,并实现了三个方法,put、get、clear。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:44
 */
public abstract class AbstractCaffeineCache<T> {
    protected LoadingCache<String, T> loadingCache;
    abstract LoadingCache<String, T> createLoadingCache();
    public boolean put(String key, T value) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        loadingCache.put(key, value);
        return Boolean.TRUE;
    }
    public T get(String key) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        try {
            return loadingCache.get(key);
        } catch (Exception e) {
            return null;
        }
    }
    public boolean clear(String key) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        loadingCache.invalidate(key);
        return Boolean.TRUE;
    }
}

创建MyCaffeineCache的缓存类,该类缓存类。创建LoadingCache类,该类设置了缓存过期的时间,最大的缓存个数。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:44
 */
public class MyCaffeineCache extends AbstractCaffeineCache {
    /**
     * Caffeine配置说明:
     * initialCapacity=[integer]: 初始的缓存空间大小
     * maximumSize=[long]: 缓存的最大条数
     * maximumWeight=[long]: 缓存的最大权重
     * expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
     * expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
     * refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
     * recordStats:开发统计功能
     *
     * @return
     */
    @Override
    LoadingCache createLoadingCache() {
        loadingCache = Caffeine.newBuilder()
                .expireAfterWrite(1000L, TimeUnit.MILLISECONDS)
                .initialCapacity(10)
                .maximumSize(100)
                .recordStats()
                .build((CacheLoader<String, String>) key -> null);
        return loadingCache;
    }
}

将MyCaffeineCache注入到spring ioc中,代码如下:

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:45
 */
@Configuration
public class CaffeineCacheConfig {
    @Bean
    public MyCaffeineCache MyCaffeineCache(){
        return new MyCaffeineCache();
    }
}

如何使用。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/1/6 9:45
 */
@Aspect
@Component
@Slf4j
public class IdempotentAspect extends BaseController {
    @Resource
    private MyCaffeineCache cache;
    private static final ThreadLocalUtil threadLocalUtil = new ThreadLocalUtil();
    @Around(value = "@annotation(idempotent)")
    public Object around(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable {
        UserBO user = getUserBO(request);
        Integer userId = user.getUserId();
        String userRequest = userId + request.getRequestURI();
        threadLocalUtil.setLocalUserRequest(userRequest);
        Object uuid = cache.get(userRequest);
        VerifyUtils.throwWhen(uuid != null, idempotent.value());
        return joinPoint.proceed();
    }
    @AfterReturning(value = "@annotation(idempotent)")
    public void afterReturning(JoinPoint point, Idempotent idempotent) {
        try {
            cache.put(threadLocalUtil.getLocalUserRequest(), UUIDUtil.simpleUUID());
        } finally {
            threadLocalUtil.clearLocalUserRequest();
        }
    }
}

使用本地缓存可以加快页面响应速度,缓存分布式缓存读压力,大量、高并发请求的网站比较适用

Caffeine配置说明:

  • initialCapacity=[integer]: 初始的缓存空间大小
  • maximumSize=[long]: 缓存的最大条数
  • maximumWeight=[long]: 缓存的最大权重
  • expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
  • expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
  • refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
  • recordStats:开发统计功能

注意: expireAfterWrite和expireAfterAccess同时存在时,以expireAfterWrite为准。

到此这篇关于Java高性能缓存框架之Caffeine详解的文章就介绍到这了,更多相关缓存框架Caffeine内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

    spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

    这篇文章主要介绍了spring-gateway filters添加自定义过滤器实现流程分析(可插拔),本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • 一文详解Spring的Enablexxx注解使用实例

    一文详解Spring的Enablexxx注解使用实例

    这篇文章主要为大家介绍了一文详解Spring的Enablexxx注解使用实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java集合List的使用详细解析

    Java集合List的使用详细解析

    这篇文章主要介绍了Java集合List的使用详细解析,List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引,鉴于Java中数组用来存储数据的局限性,我们通常使用java.util.List替代数组,需要的朋友可以参考下
    2023-11-11
  • Java设计模式之工厂模式实现方法详解

    Java设计模式之工厂模式实现方法详解

    这篇文章主要介绍了Java设计模式之工厂模式实现方法,结合实例形式较为详细的分析了工厂模式的分类、原理、实现方法与相关注意事项,需要的朋友可以参考下
    2017-12-12
  • java 字浮串提取方法汇集

    java 字浮串提取方法汇集

    用方法toCharArray public char[] toCharArray()
    2008-10-10
  • 使用Java Minio搭建自己的文件系统详解

    使用Java Minio搭建自己的文件系统详解

    这篇文章主要介绍了使用Java Minio搭建自己的文件系统的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • jdk配置完之后java -version还是默认的jdk版本问题解决过程

    jdk配置完之后java -version还是默认的jdk版本问题解决过程

    在CentOS7中配置JDK后,java -version仍显示默认JDK,因为系统默认的/usr/bin/java软链接优先级高于PATH环境变量,这篇文章主要介绍了jdk配置完之后java -version还是默认的jdk版本问题的解决过程,需要的朋友可以参考下
    2026-01-01
  • Java的JSTL标签库详解

    Java的JSTL标签库详解

    JSTL包含用于编写和开发JSP页面的一组标准标签,它可以为用户提供一个无脚本环境。在此环境中,用户可以使用标签编写代码,而无须使用Java脚本
    2023-05-05
  • SpringBoot+mybatis-plus实现多数据源配置(开箱即用)

    SpringBoot+mybatis-plus实现多数据源配置(开箱即用)

    本文介绍了dynamic-datasource-spring-boot-starter,一个用于快速集成多数据源的Spring Boot启动器,它支持多种数据源配置、分组、加密、初始化表结构、懒加载等特性,并提供了对多种数据库和组件的集成方案,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java中在控制台读取字符的实现示例

    Java中在控制台读取字符的实现示例

    Scanner是Java中的一个类,可以用于读取控制台输入,通过Scanner对象可以方便地从控制台读取数字或字符串,本文就来介绍一下Java中在控制台读取字符的实现示例,感兴趣的可以了解一下
    2023-10-10

最新评论