SpringBoot + Caffeine本地缓存
目录
- SpringBoot + Caffeine配置
- 1.引入依赖
- 2.缓存常量CacheConstants
- 2.缓存枚举类CacheEnum
- 3.缓存配置类CacheConfig
- 4.项目中使用
- 5.使用 CacheUtil 工具类
SpringBoot + Caffeine配置
Caffeine 是基于 JAVA 8 的高性能缓存库。并且在 spring5 (springboot 2.x) 后spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。其配置也相当简单,本文主要实现可以自定义多个缓存,并且针对不同缓存可以设置不同过期时间。
1.引入依赖
# gradle
implementation "com.github.ben-manes.caffeine:caffeine"# maven
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency>
2.缓存常量CacheConstants
这里我把公共的常量提取一层,复用
public class CacheConstants {/*** 默认过期时间(配置类中我使用的时间单位是秒,所以这里如 3*60 为3分钟)*/public static final int DEFAULT_EXPIRES = 3 * 60;public static final int EXPIRES_5_MIN = 5 * 60;public static final int EXPIRES_10_MIN = 10 * 60;public static final String GET_MENU = "GET:MENU:";public static final String GET_MENU_LIST = "GET:MENU:LIST:";
}
2.缓存枚举类CacheEnum
自定义缓存名称并添加到枚举中
public enum CacheEnum {/*** 获取菜单*/GET_MENU(CacheConstants.GET_MENU, CacheConstants.EXPIRES_5_MIN),/*** 获取菜单列表*/GET_MENU_LIST(CacheConstants.GET_MENU_LIST, CacheConstants.EXPIRES_10_MIN),;/*** 缓存名称*/private final String name;/*** 过期时间*/private final int expires;/*** 构造*/CacheEnum(String name, int expires) {this.name = name;this.expires = expires;}public String getName() {return name;}public int getExpires() {return expires;}
}
3.缓存配置类CacheConfig
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.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;@Configuration
public class CacheConfig {/*** Caffeine配置说明:* initialCapacity=[integer]: 初始的缓存空间大小* maximumSize=[long]: 缓存的最大条数* maximumWeight=[long]: 缓存的最大权重* expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期* expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期* refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存* weakKeys: 打开key的弱引用* weakValues:打开value的弱引用* softValues:打开value的软引用* recordStats:开发统计功能* 注意:* expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。* maximumSize和maximumWeight不可以同时使用* weakValues和softValues不可以同时使用*/@Beanpublic CacheManager cacheManager() {SimpleCacheManager cacheManager = new SimpleCacheManager();List<CaffeineCache> list = new ArrayList<>();//循环添加枚举类中自定义的缓存for (CacheEnum cacheEnum : CacheEnum.values()) {list.add(new CaffeineCache(cacheEnum.getName(),Caffeine.newBuilder().initialCapacity(50).maximumSize(1000).expireAfterWrite(cacheEnum.getExpires(), TimeUnit.SECONDS).build()));}cacheManager.setCaches(list);return cacheManager;}
}
4.项目中使用
在项目中和其它本地缓存一样使用方式,用spring自带的缓存注解,简洁易懂。
/*** Cacheable* value:缓存key的前缀。* key:缓存key的后缀。* sync:设置如果缓存过期是不是只放一个请求去请求数据库,其他请求阻塞,默认是false(根据个人需求)。* unless:不缓存空值,这里不使用,会报错*/@Cacheable(value = CacheConstants.GET_MENU, key = "#code", sync = true)public MenuVO getMenu(String code) {//业务代码}@Cacheable(value = CacheConstants.GET_MENU_LIST, key = "#page+':'+#pageSize", sync = true)public PaginationResult<MenuVO> getMenuList(Integer page, Integer pageSize) {//业务代码}
缓存失效也是一样的,可以同时失效多个,也可以失效一个,这里举例多个。一样使用自带的注解,其它操作就不一一列举了。
@Caching(evict = {@CacheEvict(value = CacheConstants.GET_MENU_LIST, allEntries = true),@CacheEvict(value = CacheConstants.GET_MENU, key = "#code")})public Boolean delete(String code) {//删除业务代码}
5.使用 CacheUtil 工具类
如果你不想使用 spring 自带注解,你也可以自己加个工具类操作缓存,如下:
import java.util.Objects;
import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Component;@Component
public class CacheUtil {@Autowiredprivate CacheManager cacheManager;private static CacheManager cm;@PostConstructpublic void init() {cm = cacheManager;}/*** 添加缓存** @param cacheName 缓存名称* @param key 缓存key* @param value 缓存值*/public static void put(String cacheName, String key, Object value) {Cache cache = cm.getCache(cacheName);cache.put(key, value);}/*** 获取缓存** @param cacheName 缓存名称* @param key 缓存key* @return*/public static Object get(String cacheName, String key) {Cache cache = cm.getCache(cacheName);if (cache == null) {return null;}return Objects.requireNonNull(cache.get(key)).get();}/*** 获取缓存(字符串)** @param cacheName 缓存名称* @param key 缓存key* @return*/public static String getString(String cacheName, String key) {Cache cache = cm.getCache(cacheName);if (cache == null) {return null;}Cache.ValueWrapper wrapper = cache.get(key);if (wrapper == null) {return null;}return Objects.requireNonNull(wrapper.get()).toString();}/*** 获取缓存(泛型)** @param cacheName 缓存名称* @param key 缓存key* @param clazz 缓存类* @param <T> 返回值泛型* @return*/public static <T> T get(String cacheName, String key, Class<T> clazz) {Cache cache = cm.getCache(cacheName);if (cache == null) {return null;}Cache.ValueWrapper wrapper = cache.get(key);if (wrapper == null) {return null;}return (T) wrapper.get();}/*** 失效缓存** @param cacheName 缓存名称* @param key 缓存key*/public static void evict(String cacheName, String key) {Cache cache = cm.getCache(cacheName);if (cache != null) {cache.evict(key);}}
}
工具类项目中使用:
@Service
public class AService {public void AMethod(){//添加缓存CacheUtil.put(CacheConstants.GET_MENU, "MANAGE_MENU", "........");//获取缓存String cacheStartTime = CacheUtil.get(CacheConstants.GET_MENU, "MANAGE_MENU", String.class);//失效缓存CacheUtil.evict(CacheConstants.GET_MENU, "MANAGE_MENU");}
}
SpringBoot + Caffeine本地缓存相关推荐
- caffeine本地缓存的使用和详解
在项目中我们经常使用缓存架构,来缓存我们的数据,比如redis.caffeine等.那么redis和caffeine有什么区别?作用又有哪些不同呢? caffeine本地缓存的使用和详解 caffei ...
- SpringBoot 使用 Caffeine 本地缓存
文章目录 一.本地缓存介绍 二.缓存组件 Caffeine 介绍 2.1. Caffeine 性能 2.2. Caffeine 配置说明 2.3. 软引用与弱引用 三.SpringBoot 集成 Ca ...
- (很全面)SpringBoot 使用 Caffeine 本地缓存
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/56/ 目录 ...
- SpringBoot 之 集成Caffeine本地缓存
Caffeine的 github地址 使用版本说明: For Java 11 or above, use 3.0.x otherwise use 2.9.x SpringBoot 有两种使用 Caff ...
- Caffeine本地缓存
一.Caffine简介 简单说,Caffine 是一款高性能的本地缓存组件 由下面三幅图可见:不管在并发读.并发写还是并发读写的场景下,Caffeine 的性能都大幅领先于其他本地开源缓存组件 二.常 ...
- Caffeine本地缓存详解
一. 概述 Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架. 基于Google的Guava Cache,Caffeine提供一个性能卓越的本地缓存(local cach ...
- Caffeine本地缓存详解(一篇就明白)
结论:Caffeine 是目前性能最好的本地缓存,因此,在考虑使用本地缓存时,直接选择 Caffeine 即可. 先看一个小例子,明白如何创建一个 Caffeine 缓存实例. Caffeine ca ...
- Springboot本地缓存和redis缓存
存储简介:最开始使用的存储结构是文件形式(如:操作系统),但这时就存在一个问题,比如:查一个大的文件的时候,就是需要全量IO(在全部文件堆中找到你需要的文件),受磁盘寻址(毫秒)和带宽的影响会很慢,所 ...
- SpringBoot+Caffeine+Redis声明式缓存
目录 [博客目的] [应用场景] [相关知识] [代码实践] 引入组件 配置文件 配置类 启动类 业务层 实体类 接口层 [博客目的] 记录一个项目中同时整合了Caffeine和Redis时,怎么使用 ...
最新文章
- 语音识别大牛Daniel Povey为何加入小米?“手机+AIoT”强大生态,开源战略是关键...
- oracle 存储过程的基本语法
- python的常用数据类型_python 常用数据类型
- Java SSM框架学习之Mybatis篇
- 堆排序 heapsort
- sqlite dev破解
- AD10封装库转到PADS封装库里
- 删除桌面上的天猫双十一图标
- educoder:实验二 数字类型及其操作(新)
- 图像风格迁移cvpr2020_浅谈风格迁移(二)任意风格迁移
- centos 7.3 iscsi登录失败问题及解决方法
- 2023临沂大学计算机考研信息汇总
- PostgreSQL索引(一)
- excel 拼接字符串公式
- 污水中去除重金属的工艺解析—离子交换树脂
- VSCode 无法跳转到定义
- u-checkbox
- App卡顿的原因及解决方案
- 数据处理之文本分词、MMSEG分词工具、斯坦福NLTK分词工具
- 如何将多个excel表格合并成一个_如何把多个pdf合并成一个pdf