全网整合营销服务商

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

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


相关文章: 整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  制作门户网站的参考文献在哪,小说网站怎么建立?  如何使用Golang安装API文档生成工具_快速生成接口文档  建站主机选择指南:服务器配置与SEO优化实战技巧  大型企业网站制作流程,做网站需要注册公司吗?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在IIS中新建站点并解决端口绑定冲突?  如何零基础开发自助建站系统?完整教程解析  学校免费自助建站系统:智能生成+拖拽设计+多端适配  ,网站推广常用方法?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  建站主机与虚拟主机有何区别?如何选择最优方案?  如何在万网主机上快速搭建网站?  兔展官网 在线制作,怎样制作微信请帖?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何高效利用200m空间完成建站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Python路径拼接规范_跨平台处理说明【指导】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在腾讯云服务器快速搭建个人网站?  如何用wdcp快速搭建高效网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何快速搭建二级域名独立网站?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  如何在阿里云高效完成企业建站全流程?  建站之星如何实现PC+手机+微信网站五合一建站?  如何获取免费开源的自助建站系统源码?  公司网站设计制作厂家,怎么创建自己的一个网站?  javascript基本数据类型及类型检测常用方法小结  如何配置WinSCP新建站点的密钥验证步骤?  如何制作网站标识牌,动态网站如何制作(教程)?  如何高效搭建专业期货交易平台网站?  孙琪峥织梦建站教程如何优化数据库安全?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何通过IIS搭建网站并配置访问权限?  免费视频制作网站,更新又快又好的免费电影网站?  制作表格网站有哪些,线上表格怎么弄?  如何在云主机快速搭建网站站点?  建站之星展会模板:智能建站与自助搭建高效解决方案  如何通过远程VPS快速搭建个人网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  建设网站制作价格,怎样建立自己的公司网站?  如何用景安虚拟主机手机版绑定域名建站?  ,交易猫的商品怎么发布到网站上去?  如何快速搭建FTP站点实现文件共享? 

您的项目需求

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