器 | 一种轻量的内存缓存

本文介绍了如何利用Java的静态变量和AtomicReference、SoftReference实现一个简单的内存缓存,适用于数据请求频繁、变动小、体量大的场景。通过避免引入额外的缓存组件,降低了系统复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green, qklhk-chocolate

贡献主题:https://github.com/xitu/juejin-markdown-themes

theme: juejin

highlight:

一、引言

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

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

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

二、实现

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

假如业务场景是为了缓存行政区域信息。

定义一个区域实体

``` @Setter @Getter @Builder public class RegionEntity {

private long id;

private String provinceName;

private String provinceCode;

} ```

包装区域的集合实体

``` @Getter @Setter @AllArgsConstructor public class DictRegionDTO {

private List<RegionEntity> regionList;

} ```

获取区域的服务接口

``` 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是为了防止缓存的数据量过大,出现堆内存不够的情况。

三、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值