H5W3
当前位置:H5W3 > java > 正文

【Java】【器篇】【缓存】一个轻量的缓存实现方式

一、引言来

系统中时常要对外暴露一些特殊数据,这些数据存储于关系型数据库中,且显著的特征是:

  • 数据请求频繁
  • 数据变动很小
  • 数据体量略大

数据请求频繁,说明要频繁的与数据库产生交互,占用与数据库的会话资源。而且数据量体量略大,又需要大量使用数据传输过程的通道。数据变动很小,说数据几乎是静态数据。
一般来说,遇到这样的场景我们会想到上缓存,例如RedisMemcachedCaffeine。但是本着能不引入,简单最好的原则,我便尝试使用Java的静态变量实现了一个简易的“缓存”。

二、实现来

具体实现如下代码,过程中使用了staticAtomicReferenceSoftReference

public class DictService {
static final AtomicReference<SoftReference<DictRegionDTO>> regionCache = new AtomicReference<>();
/**
* fetch all of region
* @return region all
*/
public Optional<DictRegionDTO>  fetchRegion(){
if(regionCache.get() !=null && regionCache.get().get() !=null ){
return Optional.ofNullable(regionCache.get().get());
}
//todo fetch by repository,return @NotNull value
final DictRegionDTO dictRegionDTO = new DictRegionDTO(new ArrayList<>());
regionCache.set(new SoftReference<>(dictRegionDTO));
return Optional.of(dictRegionDTO);
}
}

static,保证此变量全局共享。补充说明JDK8 以后静态变量存储在JVM 的堆上。

AtomicReference 保证多线程环境下使用变量时候是原子操作,实现对象引用的原子更新。

SoftReference即对象的软引用,如果一个对象具有软引用,且内存空间足够,GC就不会回收它;如果内存空间不足了,GC就会回收这些对象的内存。

使用SoftReference是为了防止缓存的数据量过大,出现堆内存不够的情况。

三、总结来

当然,这样的实现是为了不引入新的组件,增加系统的开发和维护成本。如果本身系统有使用第三方缓存的需求,例如需要持久化,分布式,缓存特殊策略等,那么大胆的使用第三方缓存吧!

本文地址:H5W3 » 【Java】【器篇】【缓存】一个轻量的缓存实现方式

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址