目前各个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,过小的话,缓存没有多大效果。










还没有评论,来说两句吧...