Java本地缓存的实现代码
发布时间 - 2026-01-11 01:00:00 点击率:次使用场景

在 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中缓存的使用及使用场景浅讲
# 来实现
# 会有
# 重写
# 多线程
# 移除
# 最老
# 将会
# 是基于
# 是由
# 两种
# 但在
# 要去
# 这类
# 这对
# 可以实现
# 不需
# 设置为
# 不加
# 数据库中
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
利用JavaScript实现拖拽改变元素大小
如何在 Pandas 中基于一列条件计算另一列的分组均值
如何用腾讯建站主机快速创建免费网站?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
EditPlus中的正则表达式 实战(1)
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
linux top下的 minerd 木马清除方法
如何确认建站备案号应放置的具体位置?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在Windows 2008云服务器安全搭建网站?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel怎么在Controller之外的地方验证数据
bing浏览器学术搜索入口_bing学术文献检索地址
Bootstrap整体框架之CSS12栅格系统
怎样使用JSON进行数据交换_它有什么限制
Laravel如何使用Blade组件和插槽?(Component代码示例)
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Laravel如何使用模型观察者?(Observer代码示例)
php 三元运算符实例详细介绍
如何挑选高效建站主机与优质域名?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何自定义建站之星模板颜色并下载新样式?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何基于PHP生成高效IDC网络公司建站源码?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
大连网站制作公司哪家好一点,大连买房网站哪个好?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何实现本地化和多语言支持?(i18n教程)
*服务器网站为何频现安全漏洞?
zabbix利用python脚本发送报警邮件的方法
如何在宝塔面板中创建新站点?
如何用好域名打造高点击率的自主建站?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
个人摄影网站制作流程,摄影爱好者都去什么网站?

