在Java中使用LocalCache如何实现本地缓存
在Java中使用 LocalCache如何实现本地缓存?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联建站是少有的网站设计、成都网站建设、营销型企业网站、成都微信小程序、手机APP,开发、制作、设计、卖友情链接、推广优化一站式服务网络公司,成立于2013年,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评
使用场景
在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。
在集群环境下,常用的分布式缓存有redis
、Memcached
等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache
)。
实现
这里提供了两种LocalCache
的实现,一种是基于ConcurrentHashMap
实现基本本地缓存,另外一种是基于LinkedHashMap
实现LRU
策略的本地缓存。
基于ConcurrentHashMap的实现
static { timer = new Timer(); map = new ConcurrentHashMap<>(); }
以ConcurrentHashMap
作为缓存的存储结构。因为ConcurrentHashMap
的线程安全的,所以基于此实现的LocalCache
在多线程并发环境的操作是安全的。在JDK1.8
中,ConcurrentHashMap
是支持完全并发读,这对本地缓存的效率也是一种提升。通过调用ConcurrentHashMap
对map
的操作来实现对缓存的操作。
私有构造函数
private LocalCache() { }
LocalCache
是工具类,通过私有构造函数强化不可实例化的能力。
缓存清除机制
/** * 清除缓存任务类 */ 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
策略。
static class LRUMapextends LinkedHashMap { ... // 省略部分代码 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 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
读写锁,来控制并发问题。
缓存淘汰机制
protected boolean removeEldestEntry(Map.Entryeldest) { return size() > DEFAULT_MAX_CAPACITY; }
此处重写LinkedHashMap
中removeEldestEntry
方法, 当缓存新增元素的时候,会判断当前map大小是否超过DEFAULT_MAX_CAPACITY
,超过则移除map中最老的节点。
缓存清除机制
缓存清除机制与ConcurrentHashMap
的实现一致,均是通过timer
实现。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
文章名称:在Java中使用LocalCache如何实现本地缓存
网站URL:http://azwzsj.com/article/jihhos.html