gpt4 book ai didi

Java LocalCache 本地缓存的实现实例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java LocalCache 本地缓存的实现实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

源码地址: GitHub 。

使用场景 。

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

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

实现 。

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

基于ConcurrentHashMap的实现 。

?
1
2
3
4
static {
   timer = new Timer();
   map = new ConcurrentHashMap<>();
}

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

私有构造函数 。

?
1
2
3
private LocalCache() {
 
}

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

缓存清除机制 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
  * 清除缓存任务类
  */
static class CleanWorkerTask extends TimerTask {
 
   private String key;
 
   public CleanWorkerTask(String key) {
     this .key = key;
   }
 
   public void run() {
     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策略.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
     }
 
   }

线程安全 。

?
1
2
3
4
5
6
7
8
/**
     * 读写锁
     */
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
 
    private final Lock rLock = readWriteLock.readLock();
 
    private final Lock wLock = readWriteLock.writeLock();

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

缓存淘汰机制 。

?
1
2
3
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
      return size() > DEFAULT_MAX_CAPACITY;
    }

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

缓存清除机制 。

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

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

原文链接:http://www.jianshu.com/p/4194483127fe# 。

最后此篇关于Java LocalCache 本地缓存的实现实例的文章就讲到这里了,如果你想了解更多关于Java LocalCache 本地缓存的实现实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com