一、引言来

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

数据请求频繁

数据变动很小

数据体量略大

数据请求频繁,说明要频繁的与数据库产生交互,占用与数据库的会话资源。而且数据量体量略大,又需要大量使用数据传输过程的通道。数据变动很小,说数据几乎是静态数据。

一般来说,遇到这样的场景我们会想到上缓存,例如Redis,Memcached,Caffeine。但是本着能不引入,简单最好的原则,我便尝试使用Java的静态变量实现了一个简易的“缓存”。

二、实现来

具体实现如下代码,过程中使用了static,AtomicReference,SoftReference。

public class DictService {

static final AtomicReference> regionCache = new AtomicReference<>();

/**

* fetch all of region

* @return region all

*/

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

三、总结来

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

java实现缓存方式_【Java】【器篇】【缓存】一个轻量的缓存实现方式相关推荐

  1. java 实体属性个数_?Java中比较实用实体转换工具介绍

    ​Java中比较实用实体转换工具介绍 文中源码地址 大家一般编码过程中,经常会遇到DO对象转化为DTO对象,对象和对象之间转换一般需要用到转换工具,毕竟使用getter/setter太过麻烦 DO:D ...

  2. 第四篇 快速、轻量、可扩展、易于使用的EmEditor

    第四篇 快速.轻量.可扩展.易于使用的EmEditor 最近一直在尝试各种文本编辑器.说实话,以前对文本编辑器没啥要求,普通的也就用Windows自带的记事本了.想要高亮或格式好点的,这时候就会使用E ...

  3. Multipass - 一个轻量虚拟机管理器

    Multipass 是一个轻量虚拟机管理器,是由 Ubuntu 运营公司 Canonical 所推出的开源项目.运行环境支持 Linux.Windows.macOS.在不同的操作系统上,使用的是不同的 ...

  4. java代码审计文件包含_代码审计--一道简单的文件包含题目的多种利用方式

    不知出自哪次CTF 前言: 本萌新最近在学习代码审计, 有一天在水群聊到代码审计如何学习, 然后某dalao丢给我一道题,说你对这题有什么看法, 本萌新一看,这不是很简单吗,想也没多想就直接上去?fi ...

  5. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  6. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  7. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  8. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  9. java小球落体问题_[Java 编程基本功] (五) 小球落体, 发奖金, 1,2,3,4 可以组成多少个数...

    [Java 编程基本功] (五) 小球落体, 发奖金, 1,2,3,4 可以组成多少个数 第十三题 一球从 100 米高度自由落下, 每次落地后反跳回原高度的一半; 再落下, 求它在第 10 次落地时 ...

最新文章

  1. Hibernate flush理解
  2. script标签的defer属性
  3. 【Python学习系列八】Python实现线性可分SVM(支持向量机)
  4. Eclipse旧版本Luna SR2(版本4.4.2)下载地址
  5. java 安卓基础面试题_android-------Java 常问的基础面试题
  6. Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!
  7. react 项目总结
  8. 数据结构——堆的C语言实现
  9. Qt中多个动态创建的按钮同时绑定一个槽函数,判断被点击的是哪个按钮
  10. Visibiltity:none与Display:none区别
  11. 自己动手写ORM框架(六):实现查询功能FindById方法
  12. 知乎通过港交所上市聆讯 2021年营收29.6亿元
  13. USACO 5.3 Window Area
  14. 科普:SDN(软件定义网络)
  15. 磁盘启动次数计算原理总结
  16. c++ 单引和双引的区别
  17. linux网络子系统分析(二)—— 协议栈分层框架的建立
  18. c语言编程串级控制,组态王-串级控制
  19. 苹果处理器性能排行榜天梯图2022 苹果处理器排行榜2022
  20. 全球诺贝尔奖得主最多的30所大学

热门文章

  1. 今日代码(20210313)--美赛代码记录
  2. CSS基础(part12)--盒子模型之外边距
  3. 20应用统计考研复试要点(part15)--应用多元分析
  4. Sklearn参数详解—贝叶斯
  5. Angular 内容投影 content projection 关于条件渲染问题的单步调试
  6. 如何根据SAP Spartacus的页面快速找到实现的Angular Component
  7. 程序员的职业病(职业素养)之一:动手写业务代码之前先考虑异常处理
  8. ant target间的dependency
  9. 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段
  10. SAP CRM WebClient UI的configuration按钮是否显示,取决于这个权限检查