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元素加透明色的技巧【方法】