环境配置:
-
JDK 版本:1.8
-
Caffeine 版本:2.8.0
-
SpringBoot 版本:2.2.2.RELEASE
参考地址:
-
Spring Boot缓存实战 Caffeine
-
Caffeine Cache-高性能Java本地缓存组件
-
博文示例项目 Github 地址:https://github.com/my-dlq/blog-example/tree/master/springboot/springboot-caffeine-cache-example
一、本地缓存介绍
缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。
之前介绍过 Redis 这种 NoSql 作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销,增加时耗。本地缓存是直接从本地内存中读取,没有网络开销,例如秒杀系统或者数据量小的缓存等,比远程缓存更合适。
二、缓存组件 Caffeine 介绍
按 Caffeine Github 文档描述,Caffeine 是基于 JAVA 8 的高性能缓存库。并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。
1、Caffeine 性能
可以通过下图观测到,在下面缓存组件中 Caffeine 性能是其中最好的。

2、Caffeine 配置说明
| 参数 | 类型 | 描述 |
|---|---|---|
| initialCapacity | integer | 初始的缓存空间大小 |
| maximumSize | long | 缓存的最大条数 |
| maximumWeight | long | 缓存的最大权重 |
| expireAfterAccess | duration | 最后一次写入或访问后经过固定时间过期 |
| refreshAfterWrite | duration | 最后一次写入后经过固定时间过期 |
| refreshAfterWrite | duration | 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存 |
| weakKeys | boolean | 打开 key 的弱引用 |
| weakValues | boolean | 打开 value 的弱引用 |
| softValues | boolean | 打开 value 的软引用 |
| recordStats | - | 开发统计功能 |
注意:
-
weakValues和softValues不可以同时使用。 -
maximumSize和maximumWeight不可以同时使用。 -
expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
3、软引用与弱引用
-
软引用: 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。
-
弱引用: 弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
1// 软引用
2Caffeine.newBuilder().softValues().build();
3
4// 弱引用
5Caffeine.newBuilder().weakKeys().weakValues().build();
三、SpringBoot 集成 Caffeine 两种方式
SpringBoot 有俩种使用 Caffeine 作为缓存的方式:
-
方式一: 直接引入 Caffeine 依赖,然后使用 Caffeine 方法实现缓存。
-
方式二: 引入 Caffeine 和 Spring Cache 依赖,使用 SpringCache 注解方法实现缓存。
下面将介绍下,这俩中集成方式都是如何实现的。
四、SpringBoot 集成 Caffeine 方式一
1、Maven 引入相关依赖
1<?xml version="1.0" encoding="UTF-8"?>
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5
6 <parent>
7 <groupId>org.springframework.boot</groupId>
8 <artifactId>spring-boot-starter-parent</artifactId>
9 <version>2.2.2.RELEASE</version>
10 </parent>
11
12 <groupId>mydlq.club</groupId>
13 <artifactId>springboot-caffeine-cache-example-1</artifactId>
14 <version>0.0.1</version>
15 <name>springboot-caffeine-cache-example-1</name>
16 <description>Demo project for Spring Boot Cache</description>
17
18 <properties>
19 <java.version>1.8</java.version>
20 </properties>
21
22 <dependencies>
23 <dependency>
24 <groupId>org.springframework.boot</groupId>
25 <artifactId>spring-boot-starter-web</artifactId>
26 </dependency>
27 <dependency>
28 <groupId>com.github.ben-manes.caffeine</groupId>
29 <artifactId>caffeine</artifactId>
30 </dependency>
31 <dependency>
32 <groupId>org.projectlombok</groupId>
33 <artifactId>lombok</artifactId>
34 </dependency>
35 </dependencies>
36
37 <build>
38 <plugins>
39 <plugin>
40 <groupId>org.springframework.boot</groupId>
41 &n

本文介绍了Caffeine作为本地缓存的优势,并详细讲解了如何在SpringBoot 2.x中集成Caffeine,包括两种集成方式:直接使用Caffeine方法实现缓存和通过SpringCache注解方式实现缓存。文中还涉及到Caffeine的性能、配置以及软引用和弱引用的概念。
最低0.47元/天 解锁文章
576

被折叠的 条评论
为什么被折叠?



