Java本地缓存的实现代码

 更新时间:2017年05月06日 09:03:33   作者:Lis`s Blog  
本篇文章主要介绍了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 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring-Security实现登录接口流程

    Spring-Security实现登录接口流程

    Security 是 Spring 家族中的一个安全管理框架,SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器,这篇文章主要介绍了Spring-Security实现登录接口,需要的朋友可以参考下
    2023-05-05
  • Java 实战项目之家政服务平台系统的实现流程

    Java 实战项目之家政服务平台系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现家政服务平台系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • java中文转拼音工具类详解

    java中文转拼音工具类详解

    这篇文章主要为大家详细介绍了java中文转拼音工具类的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Java设计模式之代理模式详解

    Java设计模式之代理模式详解

    这篇文章主要介绍了Java设计模式之代理模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Boot 集成接口管理工具 Knife4j

    Spring Boot 集成接口管理工具 Knife4j

    这篇文章主要介绍了Spring Boot 集成接口管理工具 Knife4j,首先通过创建一个 Spring Boot 项目展开主题,需要的小伙伴可以参考一下
    2022-05-05
  • SpringBoot2.x配置多数据源方式

    SpringBoot2.x配置多数据源方式

    这篇文章主要介绍了SpringBoot2.x配置多数据源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • IDEA使用properties配置文件进行mysql数据库连接的教程图解

    IDEA使用properties配置文件进行mysql数据库连接的教程图解

    Properties类是 键和值均为字符串的可以永久存储到文件中的key-value集合。这篇文章主要介绍了IDEA使用properties配置文件进行mysql数据路连接 ,需要的朋友可以参考下
    2018-10-10
  • JAVA biginteger类bigdecimal类的使用示例学习

    JAVA biginteger类bigdecimal类的使用示例学习

    这篇文章主要为大家介绍了JAVA biginteger类bigdecimal类的使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 详解Spring Aop实例之AspectJ注解配置

    详解Spring Aop实例之AspectJ注解配置

    本篇文章主要介绍了详解Spring Aop实例之AspectJ注解配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • java中下拉框select和单选按钮的回显操作

    java中下拉框select和单选按钮的回显操作

    这篇文章主要介绍了java中下拉框select和单选按钮的回显操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论