• Java 缓存机制


    缓存主要可分为二大类: 

    一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;  

    二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. 

    import java.util.Collection;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    import net.blogjava.frankiegao123.log.slf4j.Log;
    import net.blogjava.frankiegao123.log.slf4j.LogFactory;
     
    /**
     * <p>System.Config 配置缓存</p>
     *
     * @author frankiegao123
     * 2010-6-10 下午02:48:35
     */
    @Component("configCache")
    public class ConfigCache implements ConfigService {
     
        private final static Log log = LogFactory.getLog(ConfigCache.class);
     
        /**
         * 更新缓存时记录的时间
         */
        private volatile long time = 0L;
     
        /**
         * 正在更新缓存时的门闩,为 true 时表示当前没有更新缓存,为 true 时表示当前正在更新缓存
         */
        private volatile boolean updateGate = true;
     
        /**
         * 缓存容器
         */
        private Map<String, SysConfig> cache = new ConcurrentHashMap<String, SysConfig>();
     
        private CommonDao commonDao;
     
        @Autowired
        public ConfigCache(CommonDao commonDao) {
            this.commonDao = commonDao;
            log.info("initializing cache...");
            refreshCache();
            time = System.currentTimeMillis();
            log.info("initialized cache finished, cache size: {}, set cache time to current: {}, cache timeout: {}ms", cache.size(), time, ConfigConstant.CACHE_TIMEOUT);
        }
     
        /**
         * <p>根据配置的键名获取配置值</p>
         *
         * @param configKey
         * @return
         * @author frankiegao123
         * 2010-6-10 上午11:18:33
         */
        public SysConfig getSysConfig(String configKey) {
            long current = System.currentTimeMillis();
            if(updateGate && isTimeout(current)) {
                synchronized (this) {
                    if(updateGate) {
                        timeoutSynRefresh(current);
                    }
                }
            }
            return cache.get(configKey);
        }
     
        /**
         * <p>超时时更新缓存。该方法需要在同步环境中调用</p>
         * @param current
         * @author frankiegao123
         * 2010-6-10 上午11:16:30
         */
        private void timeoutSynRefresh(long current) {
            updateGate = false;
            log.info("refresh cache start..., time out: {}, size: {}, set updateGate to false", (current - time) / 1000.0, cache.size());
            try {
                refreshCache();
                time = current;
                log.info("refresh cache finished, size after update: {}, set cache time to current: {}", cache.size(), String.valueOf(time));
            } catch (Exception e) {
                log.error("refresh cache failed", e);
            } finally {
                updateGate = true;
                log.info("refresh cache finished, set updateGate to true");
            }
        }
     
        /**
         * <p>更新缓存数据</p>
         *
         * @author frankiegao123
         * 2010-6-10 上午11:15:55
         */
        private void refreshCache() {
            List<SysConfig> configs = commonDao.getSysConfigs();
            for(Iterator<SysConfig> i = configs.iterator(); i.hasNext(); ) {
                SysConfig config = i.next();
                cache.put(config.getKey(), config);
            }
            commonDao.clear();
            SysConfig config = cache.get(SysConfig.TEST_KEY);
            if(config == null) {
                log.error("refresh cache, cannot find TEST_KEY");
            } else {
                log.info("refresh cache, find TEST_KEY = [{}]", config.getValue());
            }
        }
     
        /**
         * <p>缓存是否超时</p>
         *
         * @param current
         * @return
         * @author frankiegao123
         * 2010-6-10 上午11:16:12
         */
        private boolean isTimeout(long current) {
            return (current - time >= ConfigConstant.CACHE_TIMEOUT);
        }
     
        Collection<SysConfig> getSysConfigs() {
            return Collections.unmodifiableCollection(cache.values());
        }
     
        int getSize() {
            return cache.size();
        }
     
        long getTime() {
            return time;
        }
     
        boolean isUpdateGate() {
            return updateGate;
        }
     
        void refresh() {
            time = 0L;
            log.info("refresh: reset cache time to 0");
            getSysConfig("none");
            log.info("refresh: refresh cache finished, cache: {0}", String.valueOf(time));
        }
    }
  • 相关阅读:
    给伪类设置z-index= -1;
    UITextView的字数限制 及 添加自定义PlaceHolder
    UIView 翻转动画
    viewController的自动扩展属性导致TableViewGroupStyle时向上填充
    指针属性直接赋值 最好先retain 否则内存释放导致crash
    UIButton 点击后变灰
    IOS 设置透明度导致底层View始终可见
    UIDatePicker 时间选择器
    放大Button热区的方法哟
    数组套字典排序
  • 原文地址:https://www.cnblogs.com/2714585551summer/p/5748619.html
Copyright © 2020-2023  润新知