• 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);
        }
    }
  • 相关阅读:
    setTimeOut 和 setInterval对比
    vue官方源码剖析
    Taro 总结
    地图相交
    vscode 配置文件
    redis持久化的几种方式
    推荐.Net、C# 逆向反编译四大工具利器
    【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
    【摘】Oracle 11g EM安全证书问题无法访问的解决办法
    MySql 从SQL文件导入
  • 原文地址:https://www.cnblogs.com/cj8357475/p/14961998.html
Copyright © 2020-2023  润新知