0


SpringBoot集成系列--Caffeine

文章目录

一、介绍

Caffeine是一个基于Java的高性能缓存库,旨在提供快速、可扩展和灵活的缓存解决方案。它提供了一种简单而强大的方式来管理和访问缓存数据,以提高应用程序的性能和响应速度。

Caffeine的设计目标是在内存中存储和管理数据,以减少对慢速数据源(如数据库或网络)的访问次数。它通过使用内存作为缓存介质,可以快速地读取和写入数据,从而提供更高的吞吐量和更低的延迟。

Caffeine提供了丰富的缓存功能,包括自动加载、过期策略、缓存回收和统计信息等。自动加载功能可以在缓存中不存在某个键对应的值时,自动从数据源加载并存储该值。过期策略可以设置缓存项的过期时间,以确保缓存中的数据始终保持最新。缓存回收功能可以根据一定的策略来回收不再使用的缓存项,以释放内存空间。统计信息功能可以帮助开发人员监控和优化缓存的使用情况。

二、代码

1、添加依赖

在pom.xml文件中添加caffeine的依赖

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

2、通过spring缓存实现

1)配置

我们配置缓存大小为1,过期为30s,方便我们调试

  • 方式1:在application.properties文件中配置caffeine
  1. spring.cache.type=caffeine
  2. spring.cache.caffeine.spec=maximumSize=1,expireAfterWrite=30s
  • 方式2:新增CacheConfig缓存配置类,重写CacheManager 注入Spring
  1. @ConfigurationpublicclassCacheConfig{@BeanpublicCacheManagercacheManager(){CaffeineCacheManager cacheManager =newCaffeineCacheManager();
  2. cacheManager.setCaffeine(caffeineCacheBuilder());return cacheManager;}privateCaffeine<Object,Object>caffeineCacheBuilder(){returnCaffeine.newBuilder().maximumSize(1).expireAfterWrite(Duration.ofSeconds(30));}}

2)使用

  • 方式1:@Cacheable
  1. @PostMapping("/get")@Cacheable(value ="forlan")publicObjectget(@Param("key")String key){Object data =null;return"当前时间为"+LocalDateTime.now()+",获取的内容为:"+ data;}

注:@Cacheable(value = “forlan”)表示我们的缓存的名称为forlan,大小为前面设置maximumSize,通过配置不同的缓存名称,可以实现每个缓存大小独立管理

存在问题:上面这种方式,无法手动set缓存,只有在获取的时候,才会塞缓存进去

  • 方式2:CacheManager类
  1. @PostMapping("/setCaffeine")publicStringsetCaffeine1(@Param("key")String key,@Param("value")String value){Cache caffeineCacheBuilder = cacheManager.getCache("forlan");
  2. caffeineCacheBuilder.put(key, value);return"ok";}@PostMapping("/getCaffeine")publicObjectgetCaffeine1(@Param("key")String key){Cache caffeineCacheBuilder = cacheManager.getCache("forlan");return"当前时间为"+LocalDateTime.now()+",获取的内容为:"+ caffeineCacheBuilder.get(key).get();}

3、Caffeine

1)定义配置类

新增CaffeineConfig配置类,注入名为

  1. forlanCaffeineCache

Caffeine到spring中,如下:

  1. @ConfigurationpublicclassCaffeineConfig{@BeanpublicCache<String,Object>forlanCaffeineCache(){returnCaffeine.newBuilder().maximumSize(1).expireAfterWrite(Duration.ofSeconds(30)).build();}}

定义spring上下文工具类,方便我们获取bean

  1. @ComponentpublicclassSpringUtilsimplementsApplicationContextAware{privatestaticApplicationContext applicationContext =null;@OverridepublicvoidsetApplicationContext(ApplicationContext applicationContext)throwsBeansException{if(SpringUtils.applicationContext ==null){SpringUtils.applicationContext = applicationContext;}}publicstaticApplicationContextgetApplicationContext(){return applicationContext;}publicstaticObjectgetBean(String name){returngetApplicationContext().getBean(name);}publicstatic<T>TgetBean(Class<T> clazz){returngetApplicationContext().getBean(clazz);}publicstatic<T>TgetBean(String name,Class<T> clazz){returngetApplicationContext().getBean(name, clazz);}publicstaticStringgetEnv(String envName){Environment env =SpringUtils.getApplicationContext().getEnvironment();String envValue = env.getProperty(envName);return envValue;}publicstaticStringgetProfile(){Environment env =SpringUtils.getApplicationContext().getEnvironment();String[] profile = env.getActiveProfiles();if(profile !=null&& profile.length >0){return profile[0];}return"";}}

2)使用

  1. @PostMapping("/setCaffeine")publicStringsetCaffeine(@Param("key")String key,@Param("value")String value){Cache<String,Object> caffeine =(Cache<String,Object>)SpringUtils.getBean("forlanCaffeineCache");
  2. caffeine.put(key, value);return"ok";}@PostMapping("/getCaffeine")publicObjectgetCaffeine(@Param("key")String key){Cache<String,Object> caffeine =(Cache<String,Object>)SpringUtils.getBean("forlanCaffeineCache");Object value = caffeine.asMap().get(key);return value;}

3)抽取公共代码

可以抽成一个工具类,方便我们调用,如下:

  1. publicclassCaffeineUtils{privatestaticCache<String,Object> caffeineCache;static{
  2. caffeineCache =(Cache<String,Object>)SpringUtils.getBean("forlanCaffeineCache");}publicstaticvoidput(String key,Object value){
  3. caffeineCache.put(key, value);}publicstaticObjectget(String key){return caffeineCache.asMap().get(key);}}

使用

  1. @PostMapping("/setCaffeine")publicStringsetCaffeine(@Param("key")String key,@Param("value")String value){CaffeineUtils.put(key, value);return"ok";}@PostMapping("/getCaffeine")publicObjectgetCaffeine(@Param("key")String key){Object value =CaffeineUtils.get(key);return value;}

三、通过Caffeine+Redis实现二级缓存

使用spring的注解@Cacheable配合redisTemplate,实现二级缓存,代码如下:

  1. @PostMapping("/get")@Cacheable(value ="forlan")publicObjectget(@Param("key")String key){Object data = redisTemplate.opsForValue().get(key);return"当前时间为"+LocalDateTime.now()+",获取的内容为:"+ data;}

四、小结

总的来说,在SpringBoot中使用Caffeine,大体有如下几种方式:

  • @Cacheable
  • CacheManager类
  • Caffeine类
标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/qq_36433289/article/details/135056193
版权归原作者 程序员Forlan 所有, 如有侵权,请联系我们删除。

“SpringBoot集成系列--Caffeine”的评论:

还没有评论