# Java实现本地缓存的方式
在应用中常用的缓存实现有Ehcache, redis等, 但有时使用缓存, 不关心变动性, 也无需提供存取, 清空的各种策略, 仅仅只是简单的存取, 不需要删除, 并且数据量小, 或者干脆无变动的情况(例如配置信息), 此时我们可能就需要考虑一些轻量级的方案来使用缓存了, 接下来这里介绍几种本地缓存的实现.
# 类成员变量中用Map实现缓存
当每个实例对象都需要一份缓存时, 可以使用类成员变量来缓存数据, 但这种场景也很有局限性, 如果实例对象数量多, 会导致内存中缓存的数据过大, OOM或者频繁GC的情况都可能会出现, 因此适用于初始化一些可变配置类的情况, 就是需要维持多个实例, 且实例不会被回收的情况.
public class BussinessClass {
public void UseLocalCache() {
//一个本地的缓存变量
Map<String, Object> localCacheStoreMap = new HashMap<String, Object>();
List<Object> infosList = this.getInfoList();
for (Object item : infosList) {
if (localCacheStoreMap.containsKey(item)) { //缓存命中 使用缓存数据
// todo
} else { // 缓存未命中 IO获取数据,结果存入缓存
Object valueObject = this.getInfoFromDB();
localCacheStoreMap.put(valueObject.toString(), valueObject);
}
}
}
//获取初始化数据
private List<Object> getInfoList(){
return new ArrayList<Object>();
}
//数据库获取缓存中没有的数据
private Object getInfoFromDB(){
return new Object();
}
}
# 静态变量实现缓存
适合加载一次就不关心其变动的数据, 例如配置信息
public class BussinessClass {
//创建一个httpClient
private static final HttpClient httpClient = new HttpClient();
//构造一个内存缓存map结构
private static final Map<String, Object> cache = new HashMap<>(8);
//静态代码块中初始化缓存数据
static {
HttpGet get = new HttpGet("获取需缓存的数据url");
try {
String resultStr = httpClient.execute(get);
JSONObject resultJo = new JSONObject(resultStr);
JSONArray dataJa = resultJo.getJSONArray("data");
for (int i = 0; i < dataJa.length(); i++) {
JSONObject itemJo = dataJa.getJSONObject(i);
cache.put(itemJo.getString("id"), itemJo.getObject("name"));
}
} catch (Exception e) {
throw new RuntimeException("Init Data List Error!", e);
}
}
}
# 本地缓存数据的实时性
如果需要保证应用的内存缓存数据的实时性, 可以使用zookeeper的自动发现机制实现实时变更本地静态变量缓存.
← 浅拷贝与深拷贝的自我介绍 简述 →