Java实现本地缓存

对于缓存的作用不言而喻,可以提高查询效率,比去DB查询的速度要快。项目中我们经常会使用Nosql数据库,如Redis等做缓存。但是对于数据量很小的,访问非常频繁的,我们也可以存在本地缓存中。我将利用concurrentHashMap等集合容器实现一个本地缓存。

1.基于concurrentHashMap的本地缓存。

      本地缓存一般使用键值对方式的存储,那么在Java中肯定是选用map,由于concurrentHashMap的线程安全性,所以就选择了这个。过期策略采用的定时清除,实现方式可以后台起一个线程去扫,也可以用定时器,本例子使用的是定时器。

package com.example.demoproject.demo;


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

/**
 * 
 *     基于concurrentHash的本地缓存工具类
 *     缓存删除基于timer定时器
 * 
 * @author hejianfeng
 * @date 2019/10/5
 * @param null
 * @return
 * 
 * 修改记录
 * 版本号		修订日期		修改人		bug编号		修改内容
 * 1.0.0	  2019/10/5      hejianfeng		    		     新建
 * 
*/ public class CacheUtil { //默认大小 private static final int DEFAULT_CAPACITY = 1024; // 最大缓存大小 private static final int MAX_CAPACITY = 10000; //默认缓存过期时间 private static final long DEFAULT_TIMEOUT = 3600; //1000毫秒 private static final long SECOND_TIME = 1000; //存储缓存的Map private static final ConcurrentHashMap map; private static final Timer timer; static { map = new ConcurrentHashMap<>(DEFAULT_CAPACITY); timer = new Timer(); } //私有化构造方法 private CacheUtil() { } /** *
     *     缓存任务清除类
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param null
     * @return
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ static class ClearTask extends TimerTask { private String key; public ClearTask(String key) { this.key = key; } @Override public void run() { CacheUtil.remove(key); } } //==================缓存的增删改查 /** *
     *     添加缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param key
     * @param object
     * @return void
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static boolean put(String key, Object object) { if (checkCapacity()) { map.put(key, object); //默认缓存时间 timer.schedule(new ClearTask(key), DEFAULT_TIMEOUT); return true; } return false; } /** *
     *     添加缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param key
     * @param object
     * @param time_out  :缓存过期时间:单位秒
     * @return void
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static boolean put(String key, Object object, int time_out) { if (checkCapacity()) { map.put(key, object); //默认缓存时间 timer.schedule(new ClearTask(key), time_out * SECOND_TIME); } return false; } /** *
     *     判断容量大小
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param
     * @return boolean
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static boolean checkCapacity() { return map.size() < MAX_CAPACITY; } /** *
     *     批量增加缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param m
     * @param time_out
     * @return void
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static boolean put(Map m, int time_out) { if (map.size() + m.size() <= MAX_CAPACITY) { map.putAll(map); for (String key : m.keySet()) { timer.schedule(new ClearTask(key), time_out * SECOND_TIME); } return true; } return false; } /** *
     *     删除缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param key
     * @return void
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static void remove(String key) { map.remove(key); } /** *
     *     清除所有缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param
     * @return void
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public void clearAll() { if (map.size() > 0) { map.clear(); } timer.cancel(); } /** *
     *     获取缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param key
     * @return java.lang.Object
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static Object get(String key) { return map.get(key); } /** *
     *     是否包含某个缓存
     * 
     * @author hejianfeng
     * @date 2019/10/5
     * @param key
     * @return boolean
     * 
     * 修改记录
     * 版本号		修订日期		修改人		bug编号		修改内容
     * 1.0.0	  2019/10/5      hejianfeng		    		     新建
     * 
*/ public static boolean isContain(String key) { return map.contains(key); } }

 

你可能感兴趣的:(Java)