JavaSpringBoot使用caffeine构建缓存带实例源码

Posted 小雨同学的服务器果然有问题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSpringBoot使用caffeine构建缓存带实例源码相关的知识,希望对你有一定的参考价值。

一、什么是caffeine

Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。

缓存和ConcurrentMap有点相似,但还是有所区别。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCacheAsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。

Caffeine提供了灵活的构造器去创建一个拥有下列特性的缓存:

  • 自动加载元素到缓存当中,异步加载的方式也可供选择
  • 当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐
  • 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐
  • 当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新
  • key将自动被弱引用所封装
  • value将自动被弱引用或者软引用所封装
  • 驱逐(或移除)缓存中的元素时将会进行通知
  • 写入传播到一个外部数据源当中
  • 持续计算缓存的访问统计指标

二、SpringBoot整合caffeine

1. SpringBoot项目基础运行

本次项目基于SpringBoot官方rest接口示例的完成部分进行演示

spring-guides/gs-rest-service: Building a RESTful Web Service :: Learn how to create a RESTful web service with Spring. (github.com)

这里我们使用完成部分 gs-rest-service/complete at main · spring-guides/gs-rest-service (github.com)

为了不和本地项目发生端口冲突,在项目中添加配置文件,修改端口号

server:
  port: 8100
  servlet:
    encoding:
      charset: UTF-8
      force: true

先运行项目试试

./mvnw spring-boot:run

2. 基于maven安装caffeine

目前caffeine的版本是3.0.4

com.github.ben-manes.caffeine : caffeine : 3.0.4 - Maven Central Repository Search

添加依赖

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

安装依赖

IDEA会帮我们完成依赖的安装。。。

3. 缓存注解说明

我们通过一个路由设置缓存,并通过一个路由读取缓存

SpringBoot调用Caffeine,使用的是通用的缓存注解。

Cache Providers的加载顺序如下

我们使用的注解为

  • @CacheEvict 主动清除缓存

  • @Cacheable 获取缓存

  • 在类上的注解 @EnableCaching 表示开启缓存

业务上的流程为

  1. Cacheable 从缓存取数据,没有就按业务拿到数据,并保存到缓存,返回数据 相当于 getOrSet
  2. CacheEvict 写入业务中触发清理缓存

4. 实际代码

1)修改配置文件application.yml

增加缓存配置

server:
  port: 8100
  servlet:
    encoding:
      charset: UTF-8
      force: true
spring:
  cache:
    type: caffeine

2) 类的注解 @EnableCaching 启用缓存

@EnableCaching
public class CacheController {

3) 方法的获取缓存 @Cacheable

我这里简化了内部逻辑,每次返回一个随机的数字,如果有缓存就会一直返回同一个数字。

    @GetMapping("/cache")
    @Cacheable(cacheNames = {"cache"})
    public double cacheSet(@RequestParam(value = "key") String key){
        return Math.random();
    }

4) 主动清理缓存 @CacheEvict

这里也使用get的原因是为了方便调试。

    @GetMapping("/cache/clear")
    @CacheEvict(cacheNames = {"cache"})
    public void cacheClear(@RequestParam(value = "key") String key){

    }

5. 运行效果

运行项目

./mvnw spring-boot:run

本地访问 http://localhost:8100/cache?key=diandianxiyu_geek

多次访问,发现得到的是相同的结果,表示缓存成功读取

访问清理缓存地址 http://localhost:8100/cache/clear?key=diandianxiyu_geek

因为没有设置返回值,所以没有输出

再次访问http://localhost:8100/cache?key=diandianxiyu_geek 发现结果发生变化,表示缓存已被清理,并重建。

6. 本文项目源码

本文项目源码已经托管在codechina上,可以直接克隆并运行。

小雨同学的服务器果然有问题 / springboot-caffeine · CODE CHINA (csdn.net)

三、参考资料

以上是关于JavaSpringBoot使用caffeine构建缓存带实例源码的主要内容,如果未能解决你的问题,请参考以下文章

自命为缓存之王的Caffeine

高性能缓存 Caffeine 原理及实战

Caffeine缓存 最快缓存 内存缓存

本地缓存之王——Caffeine 组件最强讲解!

Caffeine缓存

深入剖析来自未来的缓存-Caffeine