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如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Android实现代码画虚线边框背景效果
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
Python文件流缓冲机制_IO性能解析【教程】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
Laravel怎么实现模型属性的自动加密
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何快速搭建高效可靠的建站解决方案?
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel如何实现本地化和多语言支持?(i18n教程)
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何在阿里云购买域名并搭建网站?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel怎么为数据库表字段添加索引以优化查询
如何在香港服务器上快速搭建免备案网站?
怎么用AI帮你设计一套个性化的手机App图标?
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
使用豆包 AI 辅助进行简单网页 HTML 结构设计
无锡营销型网站制作公司,无锡网选车牌流程?
如何在Windows服务器上快速搭建网站?
Linux网络带宽限制_tc配置实践解析【教程】
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何为API生成Swagger或OpenAPI文档
Laravel如何保护应用免受CSRF攻击?(原理和示例)
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何注册花生壳免费域名并搭建个人网站?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
php结合redis实现高并发下的抢购、秒杀功能的实例
JS碰撞运动实现方法详解
Laravel集合Collection怎么用_Laravel集合常用函数详解
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
JS实现鼠标移上去显示图片或微信二维码
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel怎么使用Intervention Image库处理图片上传和缩放
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何用IIS7快速搭建并优化网站站点?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
零服务器AI建站解决方案:快速部署与云端平台低成本实践
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
香港服务器选型指南:免备案配置与高效建站方案解析
Python制作简易注册登录系统
如何撰写建站申请书?关键要点有哪些?
如何用wdcp快速搭建高效网站?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】

