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

      

    https://blog.csdn.net/weixin_39634532/article/details/102131226

  • 相关阅读:
    关于MSSQL导入导出时主键与约束丢失的问题解决
    逐层循环删除
    HttpContext.Current.User.Identity.IsAuthenticated
    如何给网站地址栏前增添图标
    站内搜索引擎
    一分钟加入google站内搜索代码
    【转】google谷歌百度收录网站的技巧方法,如何让百度收录?
    开启Microsoft SQL Management时,如果出现"未能加载包
    Zookeeper数据与存储
    前端学HTTP之实体和编码
  • 原文地址:https://www.cnblogs.com/achengmu/p/14369553.html
Copyright © 2011-2022 走看看