# 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的自动发现机制实现实时变更本地静态变量缓存.

修改于: 8/11/2022, 3:17:56 PM