缓存
本地缓存
本地缓存为了保证线程安全问题,一般使用ConcurrentMap的方式保存在内存之中
分布式缓存。
常见的分布式缓存则有Redis,MongoDB等。
- 一致性:本地缓存由于数据存储于内存之中,每个实例都有自己的副本,可能会存在不一致的情况;分布式缓存则可有效避免这种情况
- 开销:本地缓存会占用JVM内存,会影响GC及系统性能;分布式缓存的开销则在于网络时延和对象序列化,故主要影响调用时延
- 适用场景:本地缓存适用于数据量较小或变动较少的数据;分布式缓存则适用于一致性要求较高及数量量大的场景(可弹性扩容)
本地缓存适用于数据量较小或变动较少的数据,因为变动多需要考虑到不同实例的缓存一致性问题,而数据量大则需要考虑缓存回收策略及GC相关的问题
Guava cache
Guava Cache 是Google Fuava中的一个内存缓存模块,用于将数据缓存到JVM内存中。
提供了get、put封装操作,能够集成数据源 ;
线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素;
Guava Cache提供了多种基本的缓存回收方式
监控缓存加载/命中情况
通常,Guava缓存适用于以下情况:
- 愿意花费一些内存来提高速度。
- 使用场景有时会多次查询key。
- 缓存将不需要存储超出RAM容量的数据
https://blog.csdn.net/why_still_confused/article/details/107138230
项目中应用
配置Guava缓存
@Configuration
@EnableCaching
public class GuavaConfig {
/**
* 默认过期时间60S
*/
private final int DEFAULT_TIME_OUT = 60;
/**
* 默认缓存最大个数500
*/
private final int DEFAULT_MAXSIZE = 500;
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(
CacheBuilder.newBuilder().
expireAfterWrite(DEFAULT_TIME_OUT, TimeUnit.SECONDS).
maximumSize(DEFAULT_MAXSIZE));
return cacheManager;
}
}
使用
在controller的方法上使用,如果一分钟内相同的参数进行请求,都使用的是guava缓存中的内容,
/**
* 如果一分钟内相同的参数进行请求,都使用的是guava缓存中的内容,
* 这里配置的key和value
* @param: ids
* @param: departmentId
* @return: AppDataResult<List<Object>>
* @date: 2021/9/29
*/
@GetMapping("queryUserList")
@Cacheable(value = "user", key = "'api/user.ids:'.concat(#ids == null ? '' :#ids)" +
".concat('&departmentId:').concat(#departmentId == null ? '' : #departmentId.toString())" )
public AppDataResult<List<Object>> queryUserList(@RequestParam String ids,Long departmentId) {
//.......
return null;
}
以上
在controller的方法上使用,如果一分钟内相同的参数进行请求,通过以上方法可大幅度提高接口请求效率,但是有一定的缓冲时间,数据可能不一致,要注意数据时效性
在controller的方法上使用,如果一分钟内相同的参数进行请求,通过以上方法可大幅度提高接口请求效率,但是有一定的缓冲时间,数据可能不一致,要注意数据时效性、
在controller的方法上使用,如果一分钟内相同的参数进行请求,通过以上方法可大幅度提高接口请求效率,但是有一定的缓冲时间,数据可能不一致,要注意数据时效性