HashMap实现缓存

package com.cache;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MapCacheManager {

    private final static Log log = LogFactory.getLog(MapCacheManager.class);

    private volatile long updateTime = 0L;// 更新缓存时记录的时间

    private volatile boolean updateFlag = true;// 正在更新时的阀门,为false时表示当前没有更新缓存,为true时表示当前正在更新缓存

    private volatile static MapCacheManager mapCacheObject;// 缓存实例对象

    private static Map<String, String> cacheMap = new ConcurrentHashMap<String, String>();// 缓存容器

    private MapCacheManager() {
        this.LoadCache();// 加载缓存
        updateTime = System.currentTimeMillis();// 缓存更新时间

    }

    /**
     * 采用单例模式获取缓存对象实例
     *
     * @return
     */
    public static MapCacheManager getInstance() {
        if (null == mapCacheObject) {
            synchronized (MapCacheManager.class) {
                if (null == mapCacheObject) {
                    mapCacheObject = new MapCacheManager();
                }
            }
        }
        return mapCacheObject;
    }

    /**
     * 装载缓存
     */
    private void LoadCache() {

        this.updateFlag = true;// 正在更新

        /********** 数据处理,将数据放入cacheMap缓存中 **begin ******/
        cacheMap.put("key1", "value1");
        cacheMap.put("key2", "value2");
        cacheMap.put("key3", "value3");
        cacheMap.put("key4", "value4");
        cacheMap.put("key5", "value5");
        /********** 数据处理,将数据放入cacheMap缓存中 ***end *******/

        this.updateFlag = false;// 更新已完成

    }

    /**
     * 返回缓存对象
     *
     * @return
     */
    public Map<String, String> getMapCache() {

        long currentTime = System.currentTimeMillis();

        if (this.updateFlag) {// 前缓存正在更新
            log.info("cache is Instance .....");
            return null;

        }

        if (this.IsTimeOut(currentTime)) {// 如果当前缓存正在更新或者缓存超出时限,需重新加载
            synchronized (this) {
                this.ReLoadCache();
                this.updateTime = currentTime;
            }
        }

        return this.cacheMap;
    }

    private boolean IsTimeOut(long currentTime) {

        return ((currentTime - this.updateTime) > 1000000);// 超过时限,超时
    }

    /**
     * 获取缓存项大小
     * @return
     */
    private int getCacheSize() {
        return cacheMap.size();
    }

    /**
     * 获取更新时间
     * @return
     */
    private long getUpdateTime() {
        return this.updateTime;
    }

    /**
     * 获取更新标志
     * @return
     */
    private boolean getUpdateFlag() {
        return this.updateFlag;
    }

    /**
     * 重新装载
     */
    private void ReLoadCache() {
        this.cacheMap.clear();
        this.LoadCache();
    }

}

测试实例:

package com.cache;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public class CacheTest {

    public static void main(String[] args) {

        MapCacheManager cache = MapCacheManager.getInstance();
        Map<String, String> cacheMap = new ConcurrentHashMap<String, String>();

        cacheMap = cache.getMapCache();
        Set<String> set = cacheMap.keySet();
        Iterator<String> it = set.iterator();

        while(it.hasNext()){
            String key = it.next();
            System.out.println(key+"="+cacheMap.get(key));
        }
    }

}
时间: 2024-10-13 15:22:55

HashMap实现缓存的相关文章

HashMap的工作原理

这是一节让你深入理解hash_map的介绍,如果你只是想囫囵吞枣,不想理解其原理,你倒是可以略过这一节,但我还是建议你看看,多了解一些没有坏处. hash_map基于hash table(哈希表).哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一. 其基本原理是:使用一个下标范围比较大的数组来存储元素.可以设计一个函数(哈希函数,也

MyBatis学习总结(七)——Mybatis缓存(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,Hash

Mybatis缓存处理机制

一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如

myBatis学习(9):一级缓存和二级缓存

正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情况下,一级缓存是开启状态的.当 Session flush(); 或 close(); 之后,该Session中的所有 Cache 就将清空. 2.MyBatis二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Nam

MyBatis学习总结(七)——Mybatis缓存

一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如

Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用,我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存,我之前也写了几篇异步加载大量图片的文章,使用的内存缓存是LruCache这个类,LRU是Least Recently Used 近

缓存的简单实现

//此文基于<Java并发编程实践> 我们都知道在应用程序中合理地使用缓存,能更快的访问我们之前的计算结果,从而提高吞吐量.例如Redis和Memcached基于内存的数据存储系统等.此篇文章介绍如何实现简单缓存. 首先定义一个Computable接口A是输入,V是输出. 1 package simplecache; 2 3 /** 4 * Created by yulinfeng on 12/25/16. 5 */ 6 public interface Computable<A, V&

MyBatis学习总结(六)——Mybatis缓存

一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如

MyBatis学习总结_07_Mybatis缓存

一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如