目前各个IT系统几乎都会使用到缓存。然而在缓存里面redis和memcache的使用频率非常的高。但是我们在部分场景里面,有时候也需要实现本地缓存,这时候推荐给大家Guava Cache这个缓存框架,这个缓存目前的使用频率也非常高,同时效果和性能都还不错,因此这篇文章介绍下Guava Cache。
Guava Cache是一个基于java编写的本地缓存框架。他同时带有:缓存过期策略,缓存刷新策略,线程安全操作等特点,因此我们也可以很好的用起来,下面我们就展示下对应的demo
一、创建一个maven项目,并且引入相关依赖:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency>
二、创建一个controller做演示。
package com.sms.demo.controller; import java.util.concurrent.TimeUnit; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.sms.demo.dto.UserDTO; import com.sms.demo.model.BaseResponse; import lombok.extern.slf4j.Slf4j; @RestController @Slf4j public class GuavaController { private LoadingCache<Long, UserDTO> cache = CacheBuilder.newBuilder() // 设置缓存的最大缓存时间为30分钟,超过30分钟guava框架会自动使用lru算法进行淘汰 .expireAfterWrite(30, TimeUnit.MINUTES) // 设置缓存的最大大小是10个对象 .maximumSize(10).build(new CacheLoader<Long, UserDTO>() { @Override public UserDTO load(Long userId) { // 这里真实调用对应的方法 return loadUserInfoByUserId(userId); } }); @RequestMapping("/getUserInfoById") public BaseResponse addUser(Long userId) throws Exception { //直接从缓存取数据 UserDTO userDTO = cache.getUnchecked(userId); log.info("此时的缓存个数是:{}", cache.size()); return BaseResponse.success(userDTO); } /** * 这里根据用户id获取用户信息,这里主要是演示使用,真实环境应该需要从缓存及数据库里面获取真实数据 * * @param userId * @return */ private UserDTO loadUserInfoByUserId(Long userId) { if (1 == userId) { UserDTO dto = new UserDTO(); dto.setUserName("张三"); dto.setUserAge("15"); return dto; } else { UserDTO dto = new UserDTO(); dto.setUserName("李四"); dto.setUserAge("20"); return dto; } } }
上面我们演示了一个controller类,可以看到在controller初始化的时候我们就初始化这个Guava Cache框架,那么在真实的接口调用的时候,我们直接从缓存里面取即可,缓存获取不到数据,他会自动调用业务代码去获取到对应的信息。
测试结果也没有问题。
最后总结下:
1、在初始化Guava Cache框架的时候一定要设置缓存超时时间。
2、在初始化Guava Cache框架的时候一定要设置缓存最大个数。
3、在初始化Guava Cache框架的时候,缓存超时时间和缓存最大个数根据实际情况进行评估,不要设置过大或者过小,过大的话会导致程序容易出现OOM,过小的话,缓存没有多大效果。
还没有评论,来说两句吧...