java 使用静态hashmap实现简单缓存

Posted dw89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 使用静态hashmap实现简单缓存相关的知识,希望对你有一定的参考价值。

因项目需要的数据查询较多,数量大,所以要用到缓存,在未引用redis的情况下,仅仅只做一个速度的提升

1、Cache类

public class Cache<E> {
    private String key;//缓存ID,根据iD往hashmap存放值
    private E value;//缓存数据 ,需要缓存的对象实体
    private long timeOut;//更新时间
    private boolean expired; //是否过期
    public Cache() {
        super();
    }

    public Cache(String key, E value, long timeOut, boolean expired) {
        this.key = key;
        this.value = value;
        this.timeOut = timeOut+System.currentTimeMillis();
        this.expired = expired;
    }

    public String getKey() {
        return key;
    }

    public long getTimeOut() {
        return timeOut;
    }

    public E getValue() {
        return value;
    }

    public void setKey(String string) {
        key = string;
    }

    public void setTimeOut(long l) {
        timeOut = l;
    }

    public void setValue(E object) {
        value = object;
    }

    public boolean isExpired() {
        return expired;
    }

    public void setExpired(boolean b) {
        expired = b;
    }
}

2、CacheManager类


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

/**
 * Created by admin on 2018/1/2.
 */
public class CacheManager {
    private static HashMap cacheMap = new HashMap();

    //单实例构造方法
    private CacheManager() {
        super();
    }
    //获取布尔值的缓存
    public static boolean getSimpleFlag(String key){
        try{
            return (Boolean) cacheMap.get(key);
        }catch(NullPointerException e){
            return false;
        }
    }
    public static long getServerStartdt(String key){
        try {
            return (Long)cacheMap.get(key);
        } catch (Exception ex) {
            return 0;
        }
    }
    //设置布尔值的缓存
    public synchronized static boolean setSimpleFlag(String key,boolean flag){
        if (flag && getSimpleFlag(key)) {//假如为真不允许被覆盖
            return false;
        }else{
            cacheMap.put(key, flag);
            return true;
        }
    }
    public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){
        if (cacheMap.get(key) == null) {
            cacheMap.put(key,serverbegrundt);
            return true;
        }else{
            return false;
        }
    }

    //得到缓存。同步静态方法
    private synchronized static Cache getCache(String key) {
        return (Cache) cacheMap.get(key);
    }

    //判断是否存在一个缓存
    private synchronized static boolean hasCache(String key) {
        return cacheMap.containsKey(key);
    }

    //清除所有缓存
    public synchronized static void clearAll() {
        cacheMap.clear();
    }

    //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的TYPE是否匹配
    public synchronized static void clearAll(String type) {
        Iterator i = cacheMap.entrySet().iterator();
        String key;
        ArrayList<String> arr = new ArrayList();
        try {
            while (i.hasNext()) {
                java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
                key = (String) entry.getKey();
                if (key.startsWith(type)) { //如果匹配则删除掉
                    arr.add(key);
                }
            }
            for (int k = 0; k < arr.size(); k++) {
                clearOnly(arr.get(k));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    //清除指定的缓存
    public synchronized static void clearOnly(String key) {
        cacheMap.remove(key);
    }

    //载入缓存
    public synchronized static void putCache(String key, Cache obj) {
        cacheMap.put(key, obj);
    }

    //获取缓存信息
    public static Cache getCacheInfo(String key) {

        if (hasCache(key)) {
            Cache cache = getCache(key);
            if (cacheExpired(cache)) { //调用判断是否终止方法
                cache.setExpired(true);
                cacheMap.remove(key);
                return null;
            }
            return cache;
        }else{
            return null;
        }

    }

    //载入缓存信息
    public static void putCacheInfo(String key, Cache obj, long dt,boolean expired) {
        Cache cache = new Cache();
        cache.setKey(key);
        cache.setTimeOut(dt + System.currentTimeMillis()); //设置多久后更新缓存
        cache.setValue(obj);
        cache.setExpired(expired); //缓存默认载入时,终止状态为FALSE
        cacheMap.put(key, cache);
    }
    //重写载入缓存信息方法
    public static void putCacheInfo(String key,Cache obj,long dt){
        Cache cache = new Cache();
        cache.setKey(key);
        cache.setTimeOut(dt+System.currentTimeMillis());
        cache.setValue(obj);
        cache.setExpired(false);
        cacheMap.put(key,cache);
    }

    //判断缓存是否终止
    public static boolean cacheExpired(Cache cache) {
        if (null == cache) { //传入的缓存不存在
            return false;
        }
        long nowDt = System.currentTimeMillis(); //系统当前的毫秒数
        long cacheDt = cache.getTimeOut(); //缓存内的过期毫秒数
        if (cacheDt <= 0||cacheDt>nowDt) { //过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE
            return false;
        } else { //大于过期时间 即过期
            return true;
        }
    }

    //获取缓存中的大小
    public static int getCacheSize() {
        return cacheMap.size();
    }

    //获取指定的类型的大小
    public static int getCacheSize(String type) {
        int k = 0;
        Iterator i = cacheMap.entrySet().iterator();
        String key;
        try {
            while (i.hasNext()) {
                java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
                key = (String) entry.getKey();
                if (key.indexOf(type) != -1) { //如果匹配则删除掉
                    k++;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return k;
    }

    //获取缓存对象中的所有键值名称
    public static ArrayList getCacheAllkey() {
        ArrayList a = new ArrayList();
        try {
            Iterator i = cacheMap.entrySet().iterator();
            while (i.hasNext()) {
                java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
                a.add((String) entry.getKey());
            }
        } catch (Exception ex) {} finally {
            return a;
        }
    }

    //获取缓存对象中指定类型 的键值名称
    public static ArrayList getCacheListkey(String type) {
        ArrayList a = new ArrayList();
        String key;
        try {
            Iterator i = cacheMap.entrySet().iterator();
            while (i.hasNext()) {
                java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
                key = (String) entry.getKey();
                if (key.indexOf(type) != -1) {
                    a.add(key);
                }
            }
        } catch (Exception ex) {} finally {
            return a;
        }
    }
}

 

3、调用

    @Override
    public DcJqrfbView getMap(String qlinkId, String country, String online, String devtype, String devtype1, String beautify,String adminQLinkId) throws Exception {
        DcJqrfbView viewRespons=new DcJqrfbView();
        String cache_key=new StringBuilder().append(qlinkId).append(country).append(online).append(devtype).append(devtype1).append(beautify).append(adminQLinkId).toString();
        Cache<DcJqrfbView> c = CacheManager.getCacheInfo(cache_key);
        if(c!=null&&!c.isExpired()){
            return  c.getValue();
        }else{
            c  = new Cache(cache_key,viewRespons,10*60*1000,false);
        }
        int positionFialdNum=0;
        int noActivityNum=0;
        List<DcJqrfb> allData=new ArrayList<DcJqrfb>();
        List<DcJqrfb> data=new ArrayList<DcJqrfb>();
        DcWebResponse<List<DcJqrfb>> response=new DcWebResponse<List<DcJqrfb>>();
        Map<String,DcJqrfb> map=new HashMap<String,DcJqrfb>();
        response.setSuccess(true);
    
        response.setData(data);
        viewRespons.setResponse(response);
        viewRespons.setPositionFialdNum(positionFialdNum);
        viewRespons.setNoActivityNum(noActivityNum);
        CacheManager.putCache(cache_key,c);
        return viewRespons;
    }




















































































































































































































































































以上是关于java 使用静态hashmap实现简单缓存的主要内容,如果未能解决你的问题,请参考以下文章

java缓存redis缓存guava缓存java中实现缓存的几种方式

Map实现java缓存机制的简单实例

HashMap源码分析

java面试之Hashmap

java中HashMap详解

Java进阶教程:HashMap实现原理