美文网首页
实现一个高速缓存

实现一个高速缓存

作者: LiChangBao | 来源:发表于2019-03-17 19:33 被阅读0次
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();
    }

}

相关文章

  • 实现一个高速缓存

  • linux 同步IO: sync、fsync与fdatasync

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内...

  • 高并发基础一

    最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道;主存和高速缓存都...

  • 命题-第三章-选择

    常用虚拟存储器系统哪两级系统组成: -A.主存——外存-B.主存——高速缓存-C.高速缓存——外存-D.高速缓存—...

  • 慕课网高并发实战(一)-JAVA并发基础

    .课程网站 CPU多级缓存 左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一...

  • 内存池原理详解

    从一个问题谈起:从内核中的伙伴系统,页高速缓存系统,slab内存管理系统,常规内存高速缓存系统,到用户线性区管理,...

  • 慕课网高并发实战(二)-并发基础

    课程网址 1.CPU多级缓存 左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有...

  • 基础-ARP协议

    一、 实现IP地址到MAC地址的映射 二、原理 每个主机都有一个ARP高速缓存,里面有本局域网上的各主机和路由器的...

  • Java高并发编程学习笔记(二)-并发基础

    1.CPU多级缓存 左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的...

  • 慕课网高并发实战(二)-并发基础

    1.CPU多级缓存 左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的...

网友评论

      本文标题:实现一个高速缓存

      本文链接:https://www.haomeiwen.com/subject/mwiumqtx.html