目录

  • 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本地缓存相关推荐

  1. caffeine本地缓存的使用和详解

    在项目中我们经常使用缓存架构,来缓存我们的数据,比如redis.caffeine等.那么redis和caffeine有什么区别?作用又有哪些不同呢? caffeine本地缓存的使用和详解 caffei ...

  2. SpringBoot 使用 Caffeine 本地缓存

    文章目录 一.本地缓存介绍 二.缓存组件 Caffeine 介绍 2.1. Caffeine 性能 2.2. Caffeine 配置说明 2.3. 软引用与弱引用 三.SpringBoot 集成 Ca ...

  3. (很全面)SpringBoot 使用 Caffeine 本地缓存

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/56/ 目录 ...

  4. SpringBoot 之 集成Caffeine本地缓存

    Caffeine的 github地址 使用版本说明: For Java 11 or above, use 3.0.x otherwise use 2.9.x SpringBoot 有两种使用 Caff ...

  5. Caffeine本地缓存

    一.Caffine简介 简单说,Caffine 是一款高性能的本地缓存组件 由下面三幅图可见:不管在并发读.并发写还是并发读写的场景下,Caffeine 的性能都大幅领先于其他本地开源缓存组件 二.常 ...

  6. Caffeine本地缓存详解

    一. 概述 Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架. 基于Google的Guava Cache,Caffeine提供一个性能卓越的本地缓存(local cach ...

  7. Caffeine本地缓存详解(一篇就明白)

    结论:Caffeine 是目前性能最好的本地缓存,因此,在考虑使用本地缓存时,直接选择 Caffeine 即可. 先看一个小例子,明白如何创建一个 Caffeine 缓存实例. Caffeine ca ...

  8. Springboot本地缓存和redis缓存

    存储简介:最开始使用的存储结构是文件形式(如:操作系统),但这时就存在一个问题,比如:查一个大的文件的时候,就是需要全量IO(在全部文件堆中找到你需要的文件),受磁盘寻址(毫秒)和带宽的影响会很慢,所 ...

  9. SpringBoot+Caffeine+Redis声明式缓存

    目录 [博客目的] [应用场景] [相关知识] [代码实践] 引入组件 配置文件 配置类 启动类 业务层 实体类 接口层 [博客目的] 记录一个项目中同时整合了Caffeine和Redis时,怎么使用 ...

最新文章

  1. 语音识别大牛Daniel Povey为何加入小米?“手机+AIoT”强大生态,开源战略是关键...
  2. oracle 存储过程的基本语法
  3. python的常用数据类型_python 常用数据类型
  4. Java SSM框架学习之Mybatis篇
  5. 堆排序 heapsort
  6. sqlite dev破解
  7. AD10封装库转到PADS封装库里
  8. 删除桌面上的天猫双十一图标
  9. educoder:实验二 数字类型及其操作(新)
  10. 图像风格迁移cvpr2020_浅谈风格迁移(二)任意风格迁移
  11. centos 7.3 iscsi登录失败问题及解决方法
  12. 2023临沂大学计算机考研信息汇总
  13. PostgreSQL索引(一)
  14. excel 拼接字符串公式
  15. 污水中去除重金属的工艺解析—离子交换树脂
  16. VSCode 无法跳转到定义
  17. u-checkbox
  18. App卡顿的原因及解决方案
  19. 数据处理之文本分词、MMSEG分词工具、斯坦福NLTK分词工具
  20. 如何将多个excel表格合并成一个_如何把多个pdf合并成一个pdf

热门文章

  1. oracle常用函数及示例
  2. 174 多态案例/猫和狗
  3. 如何将excel表格导入word_「超百科0341」如何批量导入excel数据到指定格式的word表格?...
  4. 树莓派入门(八)—— 汉化Raspbian操作系统
  5. Nginx 反向代理详解
  6. 洛谷 ---- 神奇的幻方,C语言详解
  7. Maven项目构建(一):什么是Maven?
  8. ubuntu tmux
  9. MySQL的安装及客户端的使用
  10. android版本升级