文章目录
一、介绍
Caffeine是一个基于Java的高性能缓存库,旨在提供快速、可扩展和灵活的缓存解决方案。它提供了一种简单而强大的方式来管理和访问缓存数据,以提高应用程序的性能和响应速度。
Caffeine的设计目标是在内存中存储和管理数据,以减少对慢速数据源(如数据库或网络)的访问次数。它通过使用内存作为缓存介质,可以快速地读取和写入数据,从而提供更高的吞吐量和更低的延迟。
Caffeine提供了丰富的缓存功能,包括自动加载、过期策略、缓存回收和统计信息等。自动加载功能可以在缓存中不存在某个键对应的值时,自动从数据源加载并存储该值。过期策略可以设置缓存项的过期时间,以确保缓存中的数据始终保持最新。缓存回收功能可以根据一定的策略来回收不再使用的缓存项,以释放内存空间。统计信息功能可以帮助开发人员监控和优化缓存的使用情况。
二、代码
1、添加依赖
在pom.xml文件中添加caffeine的依赖
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency>
2、通过spring缓存实现
1)配置
我们配置缓存大小为1,过期为30s,方便我们调试
- 方式1:在application.properties文件中配置caffeine
spring.cache.type=caffeine
spring.cache.caffeine.spec=maximumSize=1,expireAfterWrite=30s
- 方式2:新增CacheConfig缓存配置类,重写CacheManager 注入Spring
@ConfigurationpublicclassCacheConfig{@BeanpublicCacheManagercacheManager(){CaffeineCacheManager cacheManager =newCaffeineCacheManager();
cacheManager.setCaffeine(caffeineCacheBuilder());return cacheManager;}privateCaffeine<Object,Object>caffeineCacheBuilder(){returnCaffeine.newBuilder().maximumSize(1).expireAfterWrite(Duration.ofSeconds(30));}}
2)使用
- 方式1:@Cacheable
@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类
@PostMapping("/setCaffeine")publicStringsetCaffeine1(@Param("key")String key,@Param("value")String value){Cache caffeineCacheBuilder = cacheManager.getCache("forlan");
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配置类,注入名为
forlanCaffeineCache
Caffeine到spring中,如下:
@ConfigurationpublicclassCaffeineConfig{@BeanpublicCache<String,Object>forlanCaffeineCache(){returnCaffeine.newBuilder().maximumSize(1).expireAfterWrite(Duration.ofSeconds(30)).build();}}
定义spring上下文工具类,方便我们获取bean
@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)使用
@PostMapping("/setCaffeine")publicStringsetCaffeine(@Param("key")String key,@Param("value")String value){Cache<String,Object> caffeine =(Cache<String,Object>)SpringUtils.getBean("forlanCaffeineCache");
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)抽取公共代码
可以抽成一个工具类,方便我们调用,如下:
publicclassCaffeineUtils{privatestaticCache<String,Object> caffeineCache;static{
caffeineCache =(Cache<String,Object>)SpringUtils.getBean("forlanCaffeineCache");}publicstaticvoidput(String key,Object value){
caffeineCache.put(key, value);}publicstaticObjectget(String key){return caffeineCache.asMap().get(key);}}
使用
@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,实现二级缓存,代码如下:
@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类
版权归原作者 程序员Forlan 所有, 如有侵权,请联系我们删除。