使用场景

在 Java 应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。
在集群环境下,常用的分布式缓存有 Redis 、 Memcached 等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存( LocalCache )。
实现
这里提供了两种 LocalCache 的实现,一种是基于 ConcurrentHashMap 实现基本本地缓存,另外一种是基于 LinkedHashMap 实现 LRU 策略的本地缓存。
基于ConcurrentHashMap的实现
static {
timer = new Timer();
map = new ConcurrentHashMap<>();
}
以 ConcurrentHashMap 作为缓存的存储结构。因为 ConcurrentHashMap 的线程安全的,所以基于此实现的 LocalCache 在多线程并发环境的操作是安全的。在 JDK1.8 中, ConcurrentHashMap 是支持完全并发读,这对本地缓存的效率也是一种提升。通过调用 ConcurrentHashMap 对 map 的操作来实现对缓存的操作。
私有构造函数
privateLocalCache(){
}
LocalCache 是工具类,通过私有构造函数强化不可实例化的能力。
缓存清除机制
/**
* 清除缓存任务类
*/
static classCleanWorkerTaskextendsTimerTask{
private String key;
publicCleanWorkerTask(String key){
this.key = key;
}
publicvoidrun(){
LocalCache.remove(key);
}
}
清理失效缓存是由 Timer 类实现的。内部类 CleanWorkerTask 继承于 TimerTask 用户清除缓存。每当新增一个元素的时候,都会调用 timer.schedule 加载清除缓存的任务。
基于LinkedHashMap的实现
以 LinkedHashMap 作为缓存的存储结构。主要是通过 LinkedHashMap 的按照访问顺序的特性来实现 LRU 策略。
LRU
LRU 是 Least Recently Used 的缩写,即最近最久未使用。 LRU 缓存将会利用这个算法来淘汰缓存中老的数据元素,从而优化内存空间。
基于LRU策略的map
这里利用 LinkedHashMap 来实现基于 LRU 策略的 map 。通过调用父类 LinkedHashMap 的构造函数来实例化 map 。参数 accessOrder 设置为 true 保证其可以实现 LRU 策略。
static classLRUMap<K,V>extendsLinkedHashMap<K,V>{
... // 省略部分代码
publicLRUMap(intinitialCapacity,floatloadFactor){
super(initialCapacity, loadFactor, true);
}
... // 省略部分代码
/**
* 重写LinkedHashMap中removeEldestEntry方法;
* 新增元素的时候,会判断当前map大小是否超过DEFAULT_MAX_CAPACITY,超过则移除map中最老的节点;
*
* @param eldest
* @return
*/
protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){
return size() > DEFAULT_MAX_CAPACITY;
}
}
线程安全
/** * 读写锁 */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private final Lock rLock = readWriteLock.readLock(); private final Lock wLock = readWriteLock.writeLock();
LinkedHashMap 并不是线程安全,如果不加控制的在多线程环境下使用的话,会有问题。所以在 LRUMap 中引入了 ReentrantReadWriteLock 读写锁,来控制并发问题。
缓存淘汰机制
protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){
return size() > DEFAULT_MAX_CAPACITY;
}
此处重写 LinkedHashMap 中 removeEldestEntry 方法, 当缓存新增元素的时候,会判断当前 map 大小是否超过 DEFAULT_MAX_CAPACITY ,超过则移除map中最老的节点。
缓存清除机制
缓存清除机制与 ConcurrentHashMap 的实现一致,均是通过 timer 实现。
源码地址: GitHub
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# 本地缓存
# 实现
# java实现本地高速缓存
# Java实现一个简单的缓存方法
# 基于Java实现缓存Cache的深入分析
# Java 实现缓存的三种方式及问题汇总
# Java中缓存的使用及使用场景浅讲
# 来实现
# 会有
# 重写
# 多线程
# 移除
# 最老
# 将会
# 是基于
# 是由
# 两种
# 但在
# 要去
# 这类
# 这对
# 可以实现
# 不需
# 设置为
# 不加
# 数据库中
# 大家多多
相关文章:
seo网站制作优化,网站SEO优化步骤有哪些?
建站主机选购指南:核心配置优化与品牌推荐方案
建站之星代理如何获取技术支持?
建站之星代理如何优化在线客服效率?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
教学论文网站制作软件有哪些,写论文用什么软件
?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
建站10G流量真的够用吗?如何应对访问高峰?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何用景安虚拟主机手机版绑定域名建站?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
网站制作公司排行榜,抖音怎样做个人官方网站
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
建站之星图片链接生成指南:自助建站与智能设计教程
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何快速建站并高效导出源代码?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何通过.red域名打造高辨识度品牌网站?
建站主机服务器选购指南:轻量应用与VPS配置解析
在线教育网站制作平台,山西立德教育官网?
如何通过远程VPS快速搭建个人网站?
如何选择高效可靠的多用户建站源码资源?
中山网站制作网页,中山新生登记系统登记流程?
h5网站制作工具有哪些,h5页面制作工具有哪些?
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何在宝塔面板中创建新站点?
Python多线程使用规范_线程安全解析【教程】
广德云建站网站建设方案与建站流程优化指南
如何制作一个表白网站视频,关于勇敢表白的小标题?
油猴 教程,油猴搜脚本为什么会网页无法显示?
,怎么在广州志愿者网站注册?
c# await 一个已经完成的Task会发生什么
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
官网网站制作腾讯审核要多久,联想路由器newifi官网
建站之星后台管理如何实现高效配置?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
平台云上自主建站:模板化设计与智能工具打造高效网站
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何将凡科建站内容保存为本地文件?
ui设计制作网站有哪些,手机UI设计网址吗?
高端建站如何打造兼具美学与转化的品牌官网?
如何选择高性价比服务器搭建个人网站?
c# 服务器GC和工作站GC的区别和设置
h5在线制作网站电脑版下载,h5网页制作软件?
*请认真填写需求信息,我们会在24小时内与您取得联系。