AwdbCacheImpl.java

package com.xenoamess.ipplus360.impl;

import com.xenoamess.ipplus360.AwdbNodeCache;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 使用 {@link ConcurrentHashMap} 的简单缓存.
 */
public class AwdbCacheImpl implements AwdbNodeCache {
    private static final int DEFAULT_CAPACITY = 4096;
    private final ConcurrentHashMap<Long, JsonNode> cache;

    public AwdbCacheImpl() {
        this(DEFAULT_CAPACITY);
    }

    public AwdbCacheImpl(int capacity) {
        this.cache = new ConcurrentHashMap<>(capacity);
    }

    @Override
    public JsonNode get(Loader loader, long key) throws IOException {
        try {
            // loader 返回 null 时不缓存(ConcurrentHashMap 不允许 null 值)
            return cache.computeIfAbsent(key, k -> {
                try {
                    return loader.load(k);
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            });
        } catch (UncheckedIOException e) {
            throw e.getCause();
        }
    }
}