• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java LocalCache 本地缓存的实现实例

Java LocalCache 本地缓存的实现实例

作者:特立独行的猪手 字体:[增加 减小] 来源:互联网 时间:2017-05-28

特立独行的猪手 通过本文主要向大家介绍了java localcache,java localdate,java localdatetime,java local,java threadlocal等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

源码地址: GitHub

使用场景

在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。

在集群环境下,常用的分布式缓存有Redis、Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。

实现

这里提供了两种LocalCache的实现,一种是基于ConcurrentHashMap实现基本本地缓存,另外一种是基于LinkedHashMap实现LRU策略的本地缓存。

基于ConcurrentHashMap的实现

  static {
    timer = new Timer();
    map = new ConcurrentHashMap<>();
  }
</div>

以ConcurrentHashMap作为缓存的存储结构。因为ConcurrentHashMap的线程安全的,所以基于此实现的LocalCache在多线程并发环境的操作是安全的。在JDK1.8中,ConcurrentHashMap是支持完全并发读,这对本地缓存的效率也是一种提升。通过调用ConcurrentHashMap对map的操作来实现对缓存的操作。

私有构造函数

  private LocalCache() {

  }
</div>

LocalCache是工具类,通过私有构造函数强化不可实例化的能力。

缓存清除机制

  /**
   * 清除缓存任务类
   */
  static class CleanWorkerTask extends TimerTask {

    private String key;

    public CleanWorkerTask(String key) {
      this.key = key;
    }

    public void run() {
      LocalCache.remove(key);
    }
  }
</div>

清理失效缓存是由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 class LRUMap<K, V> extends LinkedHashMap<K, V> {

    ... // 省略部分代码

    public LRUMap(int initialCapacity, float loadFactor) {
      super(initialCapacity, loadFactor, true);
    }

    ... // 省略部分代码

    /**
     * 重写LinkedHashMap中removeEldestEntry方法;
     * 新增元素的时候,会判断当前map大小是否超过DEFAULT_MAX_CAPACITY,超过则移除map中最老的节点;
     *
     * @param eldest
     * @return
     */
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }

  }
</div>

线程安全

 /**
     * 读写锁
     */
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    private final Lock rLock = readWriteLock.readLock();

    private final Lock wLock = readWriteLock.writeLock();

</div>

LinkedHashMap并不是线程安全,如果不加控制的在多线程环境下使用的话,会有问题。所以在LRUMap中引入了ReentrantReadWriteLock读写锁,来控制并发问题。

缓存淘汰机制

 protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }
</div>

此处重写LinkedHashMap中removeEldestEntry方法, 当缓存新增元素的时候,会判断当前map大小是否超过DEFAULT_MAX_CAPACITY,超过则移除map中最老的节点。

缓存清除机制

缓存清除机制与ConcurrentHashMap的实现一致,均是通过timer实现。

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Java中LocalCache本地缓存实现代码
  • Java LocalCache 本地缓存的实现实例
  • Java中LocalCache本地缓存实现代码
  • Java LocalCache 本地缓存的实现实例

相关文章

  • 2017-05-28springboot + mybatis配置多数据源示例
  • 2017-05-28Java微信公众平台开发(4) 回复消息的分类及实体的创建
  • 2017-05-28servlet监听实现统计在线人数功能 附源码下载
  • 2017-05-28MyBatis拦截器:给参数对象属性赋值的实例
  • 2017-05-28详解Mybatis的二级缓存配置
  • 2017-05-28java基础中异常及包归纳整理
  • 2017-05-28java web开发中大量数据导出Excel超时(504)问题解决
  • 2017-05-28java web SpringMVC后端传json数据到前端页面实例代码
  • 2017-05-28通过Session案例分析一次性验证码登录
  • 2017-05-28java 中HttpClient传输xml字符串实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • SWT(JFace)体验之图片的动态渐变效果
    • java 实现对List做二分查找(支持泛型)
    • 老生常谈java中的数组初始化
    • eclipse/intellij idea 查看java源码和注释方法
    • Java 操作Properties配置文件详解
    • Java线程的生命周期和状态控制_动力节点Java学院整理
    • javaweb中mysql数据库连接步骤方法及其实例
    • response.setHeader各种用法详解
    • Java语言实现简单FTP软件 FTP软件主界面(4)
    • Java实现监控多个线程状态的简单实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有