实现一个高速缓存

import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.reflect.Field;
import java.util.Hashtable;

/**
 * 简单的缓存工具
 *
 * @param <K> 缓存对象的主键
 * @param <V> 缓存实例
 */
public class DataCache<K, V> {

    private volatile static DataCache dataCache;

    private Hashtable<K, DataReference> dataReferenceMap;

    private ReferenceQueue<V> dataQueue;

    private DataCache() {
        dataReferenceMap = new Hashtable();
        dataQueue = new ReferenceQueue();
    }

    private class DataReference extends SoftReference<V> {
        private K key;

        public DataReference(V data, String primaryKey) throws Exception {
            super(data, dataQueue);
            try {
                Field field = data.getClass().getDeclaredField(primaryKey);
                field.setAccessible(true);
                key = (K) field.get(data);
            }catch (Exception e){
                throw e;
            }
        }
    }

    public static DataCache createCache() {
        if (dataCache == null) {
           synchronized (DataCache.class) {
              if(dataCache == null){
                 dataCache = new DataCache();
              }
           }
         }
        return dataCache;
    }

    /**
     * 向缓存中添加数据
     *
     * @param data       待缓存的实例
     * @param primaryKeyName 实例对应数据库中的主键
     */
    public void setCacheValue(V data, String primaryKeyName) throws Exception {
        cleanCache();
        DataReference dataReference = new DataReference(data,  primaryKeyName);
        dataReferenceMap.put(dataReference.key, dataReference);
    }

    /**
     * 从缓存中取数据
     *
     * @return
     */
    public V getCacheValue(K primaryKeyValue) {
        V data = null;
        if(dataReferenceMap.containsKey(primaryKeyValue)){
            data = dataReferenceMap.get(primaryKeyValue).get();
        }
        return data;
    }

    private void cleanCache() {
        DataReference ref = null;
        while ((ref = (DataReference) dataQueue.poll()) != null) {
            dataReferenceMap.remove(ref.key);
        }
    }

    public void clearAll() {
        cleanCache();
        dataReferenceMap.clear();
        System.gc();
        System.runFinalization();
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容