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排名与功能模块?  个人摄影网站制作流程,摄影爱好者都去什么网站?