Java内存缓存
什么是缓存
- 在计算中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存位置快。通过缓存,您可以高效地重用之前检索或计算的数据。
为什么要用缓存
- 提升应用程序的性能。
- 降低数据库成本。
- 减少后端负载。
- 可预测的性能。
- 消除数据库热点。
- 提高读取吞吐量(IOPS)。
Java内存缓存
-
在Java应用中,对于访问频次高,更新少的数据,通常的方案是将这类数据加入缓存中。相对于从数据库中读取来说,读缓存效率会有很大提升。
-
在集群环境下,常用的分布式缓存有Redis,Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存。
-
自己实现一个小缓存。
public class MapCacheDemo { // 我使用了 ConcurrentHashMap,线程安全的要求。 //我使用SoftReference <Object> 作为映射值,因为软引用可以保证在抛出OutOfMemory之前,如果缺少内存,将删除引用的对象。 //在构造函数中,我创建了一个守护程序线程,每5秒扫描一次并清理过期的对象。 private static final int CLEAN_UP_PERIOD_IN_SEC = 5; private final ConcurrentHashMap<String, SoftReference<CacheObject>> cache = new ConcurrentHashMap<>(); public MapCacheDemo() { Thread cleanerThread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(CLEAN_UP_PERIOD_IN_SEC * 1000); cache.entrySet().removeIf(entry -> Optional.ofNullable(entry.getValue()).map(SoftReference::get).map(CacheObject::isExpired).orElse(false)); } catch (InterruptedException e) { Thread.currentThread()