全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java本地缓存的实现代码

使用场景

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中缓存的使用及使用场景浅讲  # 来实现  # 会有  # 重写  # 多线程  # 移除  # 最老  # 将会  # 是基于  # 是由  # 两种  # 但在  # 要去  # 这类  # 这对  # 可以实现  # 不需  # 设置为  # 不加  # 数据库中  # 大家多多 


相关文章: seo网站制作优化,网站SEO优化步骤有哪些?  建站主机选购指南:核心配置优化与品牌推荐方案  建站之星代理如何获取技术支持?  建站之星代理如何优化在线客服效率?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  教学论文网站制作软件有哪些,写论文用什么软件 ?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  建站10G流量真的够用吗?如何应对访问高峰?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何用景安虚拟主机手机版绑定域名建站?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  网站制作公司排行榜,抖音怎样做个人官方网站  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  建站之星图片链接生成指南:自助建站与智能设计教程  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速建站并高效导出源代码?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何通过.red域名打造高辨识度品牌网站?  建站主机服务器选购指南:轻量应用与VPS配置解析  在线教育网站制作平台,山西立德教育官网?  如何通过远程VPS快速搭建个人网站?  如何选择高效可靠的多用户建站源码资源?  中山网站制作网页,中山新生登记系统登记流程?  h5网站制作工具有哪些,h5页面制作工具有哪些?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何在宝塔面板中创建新站点?  Python多线程使用规范_线程安全解析【教程】  广德云建站网站建设方案与建站流程优化指南  如何制作一个表白网站视频,关于勇敢表白的小标题?  油猴 教程,油猴搜脚本为什么会网页无法显示?  ,怎么在广州志愿者网站注册?  c# await 一个已经完成的Task会发生什么  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站之星后台管理如何实现高效配置?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  平台云上自主建站:模板化设计与智能工具打造高效网站  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何将凡科建站内容保存为本地文件?  ui设计制作网站有哪些,手机UI设计网址吗?  高端建站如何打造兼具美学与转化的品牌官网?  如何选择高性价比服务器搭建个人网站?  c# 服务器GC和工作站GC的区别和设置  h5在线制作网站电脑版下载,h5网页制作软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。