使用场景

在 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中缓存的使用及使用场景浅讲
# 来实现
# 会有
# 重写
# 多线程
# 移除
# 最老
# 将会
# 是基于
# 是由
# 两种
# 但在
# 要去
# 这类
# 这对
# 可以实现
# 不需
# 设置为
# 不加
# 数据库中
# 大家多多
相关文章:
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
制作门户网站的参考文献在哪,小说网站怎么建立?
如何使用Golang安装API文档生成工具_快速生成接口文档
建站主机选择指南:服务器配置与SEO优化实战技巧
大型企业网站制作流程,做网站需要注册公司吗?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何在IIS中新建站点并解决端口绑定冲突?
如何零基础开发自助建站系统?完整教程解析
学校免费自助建站系统:智能生成+拖拽设计+多端适配
,网站推广常用方法?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
建站主机与虚拟主机有何区别?如何选择最优方案?
如何在万网主机上快速搭建网站?
兔展官网 在线制作,怎样制作微信请帖?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何高效利用200m空间完成建站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Python路径拼接规范_跨平台处理说明【指导】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何在腾讯云服务器快速搭建个人网站?
如何用wdcp快速搭建高效网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何快速搭建二级域名独立网站?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
如何在阿里云高效完成企业建站全流程?
建站之星如何实现PC+手机+微信网站五合一建站?
如何获取免费开源的自助建站系统源码?
公司网站设计制作厂家,怎么创建自己的一个网站?
javascript基本数据类型及类型检测常用方法小结
如何配置WinSCP新建站点的密钥验证步骤?
如何制作网站标识牌,动态网站如何制作(教程)?
如何高效搭建专业期货交易平台网站?
孙琪峥织梦建站教程如何优化数据库安全?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何通过IIS搭建网站并配置访问权限?
免费视频制作网站,更新又快又好的免费电影网站?
制作表格网站有哪些,线上表格怎么弄?
如何在云主机快速搭建网站站点?
建站之星展会模板:智能建站与自助搭建高效解决方案
如何通过远程VPS快速搭建个人网站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建设网站制作价格,怎样建立自己的公司网站?
如何用景安虚拟主机手机版绑定域名建站?
,交易猫的商品怎么发布到网站上去?
如何快速搭建FTP站点实现文件共享?
*请认真填写需求信息,我们会在24小时内与您取得联系。