缓存

什么是缓存?
平常的开发项目中,多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。

缓存的使用场景:
在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中,相对从数据库中读取,读缓存效率会有很大提升。
在集群环境下,常用的分布式缓存有Redis等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。

使用map缓存

方案:

  • 基于ConcurrentHashMap实现数据缓存,实现线程安全要求
  • SoftReference:当内存不够的时候,GC会回收SoftReference所引用的对象

SoftReference是软引用,它保存的对象实例,除非JVM即OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。

代码如下:

/*** 使用map做缓存*/
public class MapCache {//定义扫描时间参数private static final int CLEAN_TIME_PARAMETER = 5;private final ConcurrentHashMap<String, SoftReference<CacheObject>> cache = new ConcurrentHashMap<>();/*** 在构造函数中,创建一个守护程序线程,每5秒扫描一次并清理过期的对象。*/public MapCache(){Thread cleanerThread = new Thread(()->{//获取线程中断状态while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(CLEAN_TIME_PARAMETER * 1000);cache.entrySet().removeIf(entry ->Optional.ofNullable(entry.getValue()).map(SoftReference::get).map(CacheObject::isExpired).orElse(false));} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});cleanerThread.setDaemon(true);cleanerThread.start();}public void add(String key, Object value, long periodInMillis) {if(key == null){return;}if(value == null){cache.remove(key);}else {long expiryTime = System.currentTimeMillis() + periodInMillis;cache.put(key, new SoftReference<>(new CacheObject(value, expiryTime)));}}public void remove(String key) {cache.remove(key);}public Object get(String key) {return Optional.ofNullable(cache.get(key)).map(SoftReference::get).filter(cacheObject -> !cacheObject.isExpired()).map(CacheObject::getValue).orElse(null);}public void clear() {cache.clear();}public long size() {return cache.entrySet().stream().filter(entry -> Optional.ofNullable(entry.getValue()).map(SoftReference::get).map(cacheObject -> !cacheObject.isExpired()).orElse(false)).count();}/*** 缓存对象value*/private static class CacheObject {private Object value;private long expiryTime;private CacheObject(Object value, long expiryTime) {this.value = value;this.expiryTime = expiryTime;}boolean isExpired() {return System.currentTimeMillis() > expiryTime;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}}
}

测试类:

public class Test {public static void main(String[] args) throws InterruptedException {MapCache mapCache = new MapCache();mapCache.add("10001", "111111", 5 * 1000);mapCache.add("10002", "222222", 5 * 1000);mapCache.add("10003", "333333", 5 * 1000);System.out.println("从缓存中取出值:" + mapCache.get("10001"));Thread.sleep(5000L);System.out.println("5秒钟过后");// 5秒后数据自动清除了System.out.println("从缓存中取出值:" + mapCache.get("10001"));}
}

Optional类

关于Optional类,是jdk1.8引进的新特性,主要解决的问题是臭名昭著的空指针异常(NullPointerException)
参考文章:Optional类的学习,理解,使用

java使用Map缓存相关推荐

  1. java 监听map的数据_使用监听器:定时清除map缓存的key value .

    使用监听器:定时清除map缓存的key value . 配置web.xml:注意位置 com.my.common.listener.TimerListener 监听类: public class Ti ...

  2. java map 缓存池_map端合并(分布式缓存)

    [TOC] # 分析 适用于关联表中有小表的情形 可以将小表分发到所有的map节点,这样,map节点就可以在本地对自己所读到的大表数据进行合并并输出最终结果,可以大大提高合并操作的并发速度 **Dis ...

  3. java map 缓存数据_Map方式实现JAVA数据缓存

    首先建一个map,该map用来存放所有的数据 protected static Map map = new HashMap<>(); 加载所有User,将其放入到User中,map的key ...

  4. java map 缓存数据_java使用hashMap缓存保存数据的方法

    本文实例讲述了java使用hashMap缓存保存数据的方法.分享给大家供大家参考,具体如下: private static final HashMap sCache = new HashMap(); ...

  5. Java 中常用缓存Cache机制的实现

    /* *所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. *内存缓存,也就是实现一个类中静态Map,对 ...

  6. java cacheutil_Java 常用缓存Cache机制的实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类:一.通过文件缓存,顾名思义文件 ...

  7. html访问java接口出现缓存_一个牛逼的多级缓存实现方案

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 TMC,即"透明多级缓存(Transparent Multile ...

  8. Java将map置空_Java实现过滤掉map集合中key或value为空的值示例

    Java实现过滤掉map集合中key或value为空的值示例 发布时间:2020-09-16 23:26:14 来源:脚本之家 阅读:147 作者:May的博客 本文实例讲述了Java实现过滤掉map ...

  9. php 解析java map,java_java遍历Map的几种方法分析,本文实例分析了java遍历Map的几 - phpStudy...

    java遍历Map的几种方法分析 本文实例分析了java遍历Map的几种方法.分享给大家供大家参考,具体如下: Java代码: Map map=new HashMap(); map.put(" ...

最新文章

  1. 书单 | 技术人要有产品思维
  2. 【直播回顾及资料下载】小程序云应用入门实操系列课程第一讲...
  3. 光伏发电对系统冲击大 “十三五”电力规划重点增强调峰能力
  4. 透视变换--基于getPerspectiveTransform()及像素赋值(未涉及插值)
  5. angular组件图标无法显示的问题
  6. JMeter 学习笔记从不懂慢慢提升(01)
  7. zotero无法同步caj文件 attachments skipped because they are top-level items, file does not exist
  8. 微信DAT文件转JPG图片(图片恢复)
  9. Python 断言的使用
  10. matlab的梯形公式推导公式,用MATLAB作数值积分例.计算1)矩形公式和梯形公式将(0,4)-Read.ppt...
  11. bzoj 1208 宠物收养所 Splay入门
  12. MySQL中的文本处理函数整理,收藏速查
  13. 蓝桥杯必备算法二:二分搜索
  14. Element Plus 跟踪表格数据总数,包括查询、筛选等操作
  15. 【QFD】质量保证需求
  16. 网络舆情信息传播动态监测查询方法
  17. 基于C#的Modbus的(NModbus)研究(DTS686电表)——实现TCP通信连接(二)
  18. android-adapterservice
  19. 计算机网络原理第4章 网络层
  20. Nginx 日志采集与分析

热门文章

  1. 可擦写光盘不能擦除和刻写_刻录光盘怎么看是不是可擦写的?
  2. xgboost Dmatrix label全为0 解决方法
  3. 红帽linux 加固,RedHat 密码策略加固
  4. 《金文女神解说VB基础入门系列视频教程》300集 第一章笔记
  5. 北京奥运会圆满结束了
  6. 基于Android的校园购物系统设计及实现
  7. 2020年中国工业传感器市场年度报告
  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第53讲:PHP smarty模板配置及变量操作
  9. IBM磁盘阵列配置教程
  10. Option 82在校园网的应用与实现(转)