java map 缓存_缓存用于

java map 缓存_缓存用于缓存什么是缓存?平常的开发项目中,多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。缓存的使用场景:在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中,相对从数据库中读取,读缓存效率会有很大提升。在集群环境下,常用的分布式缓存有Redis等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。使用map缓存方案:基于ConcurrentHashMap实现数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

缓存

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

缓存的使用场景:
在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类的学习,理解,使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188445.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • php上传文件与图片到七牛的实例详解

    php上传文件与图片到七牛的实例详解

    2021年10月27日
  • java布隆过滤器解决redis缓存穿透_redis缓存怎么过滤数据

    java布隆过滤器解决redis缓存穿透_redis缓存怎么过滤数据1:业务场景引入1:需求①原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?解决方案1:将10亿个号码存入数据库中,进行数据库查询,准确性有了,但是速度会比较慢。解决办法二:将10亿号码放入内存中,比如Redis缓存中,这里我们算一下占用内存大小:10亿*8字节=8GB,通过内存查询,准确性和速度都有了,但是大约8gb的内存空间,挺浪费内存空间的。2:需求②接触过爬虫的,应该有这么一个需求,需要爬虫的网站千千万万,对于一个新的网站url,

  • 一文弄懂什么是Precision,Recall,F1score,以及accuracy[通俗易懂]

    一文弄懂什么是Precision,Recall,F1score,以及accuracy[通俗易懂]近期在做实验的时候一直出现Precision,Recall,F1score,以及accuracy这几个概念,为了防止混淆,在这里写下学习笔记,方便以后复习。以一个二分类问题为例,样本有正负两个类别。那么模型预测的结果和真实标签的组合就有4种:TP,FP,FN,TN,如下图所示。TP实际为正样本你预测为正样本,FN实际为正样本你预测为负样本,FP实际为负样本你预测为正样本,TN实际为负样本…

    2022年10月14日
  • hdfs解决什么问题_hadoop命令和hdfs命令区别

    hdfs解决什么问题_hadoop命令和hdfs命令区别在已经配置好hadoop的环境下,查看hdfs所有目录如下命令不起作用./bin/hdfsdfs-ls.//应该更改为hdfsdfs-ls/同理查看user/hadoop/input目录内文件情况hdfsdfs-ls/user/hadoop/input上传到指定目录//hdfsdfs-put/本地文件目录hdfs目录//例如hdfsdfs-put/home/hadoop/myLocalFile.txtinput//

  • C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解

    C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解首先声明,代码是抄的,代码是抄的,代码是抄的,重要的事情说三遍。。如果有侵权请联系我删除。。贴原作者的视频。在b站看的,视频找不到了,我等下会贴代码。。先分析一下游戏的数据结构:1.游戏地图用一个数组bk[20][20]存储,有四种状态。0表示没东西;1表示墙;2表示果实;3表示蛇。2.用xy[2]来存放蛇前进的坐标,xy[0]表示横坐标,xy[1]表示纵坐标。。3.move[20][20]表示蛇…

  • drone无人机是什么意思_无人机怎么选择

    drone无人机是什么意思_无人机怎么选择所以看到XTDronehttps://mp.weixin.qq.com/s/yU_xj8bMAASm8cIZnn2iZw看到Dronekit

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号