`
javaboychina
  • 浏览: 62092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java缓存机制

    博客分类:
  • JAVA
 
阅读更多
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));
    }
}
分享到:
评论

相关推荐

    java 缓存机制

    Java 缓存机制是提高...综上所述,Java缓存机制涉及到声明式缓存的使用、缓存抽象的理解以及Web开发中的会话管理、Cookie和SSO实现。在实际应用中,还需要考虑SEO策略,合理利用各种技术来提升用户体验和系统的性能。

    JAVA缓存研究之剖析Jive的缓存机制

    JAVA缓存研究之剖析Jive的缓存机制JAVA缓存研究之剖析Jive的缓存机制

    java缓存_源代码

    Java缓存技术是提高应用程序性能的关键工具,尤其是在处理大量数据...总之,通过深入学习这些源代码和文档,你可以增强对Java缓存机制的理解,学习如何有效地利用缓存提高应用性能,并为未来项目中的缓存设计提供参考。

    Java 中常用缓存Cache机制的实现

    在 Java 中,缓存机制的实现可以通过各种方式,例如使用 HashMap、TreeMap、LinkedHashMap 等数据结构来存储缓存对象。下面是一个简单的缓存管理器的实现: CacheManager 类的实现: CacheManager 类是一个简单...

    Java缓存详解,降低系统开销,提高效率

    总的来说,Java缓存机制是提升系统性能的重要工具。理解缓存的原理和各种策略,结合拦截器等设计模式,能够帮助我们更高效地构建高可用、高性能的应用。在实际开发中,还需要根据系统的具体需求和性能指标,选择合适...

    java缓存理解

    #### 一、Java缓存机制概览 在软件开发过程中,缓存是一种非常重要的优化手段,它能够显著提升系统的性能和响应速度。Java平台提供了多种缓存解决方案,其中Ehcache是一种广泛应用且功能强大的开源缓存方案。 ####...

    Java 日志缓存机制的实现

    本文介绍了 Java 日志机制,并通过扩展日志功能,实现日志缓存。同时,可以动态控制日志信息打印到日志文件的级别,从而提高了日志的灵活性,给产品质量带来更大的帮助。文章主要围绕 MemoryHandler 类和 logging....

    Java实现LRU缓存机制:深入解析与高效编码实践

    在Java中实现LRU缓存机制,不仅可以帮助我们更好地理解和应用数据结构,还能在实际开发中提高程序的性能。本文将详细介绍如何在Java中实现LRU缓存机制,包括其原理、实现方式以及编码实践。 LRU缓存机制是一种非常...

    Java中各类Cache机制实现解决方案

    本文将详细介绍几种常见的Java缓存机制及其实现方法,帮助开发者更好地理解和应用这些技术。 #### 二、OSCache **OSCache** 是一个功能强大的开源Java EE缓存框架。它可以用于缓存JSP页面、HTTP响应以及Java对象等...

    Java缓存技术的使用实例

    Java缓存技术是提高应用程序性能的关键工具,尤其是在处理大量数据时。它通过存储频繁访问的数据在内存中,避免了重复的数据库查询,显著提升了响应速度。在这个“Java缓存技术的使用实例”中,我们将深入探讨Java...

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    MyBatis-05 缓存机制

    EhCache是一款广泛使用的Java缓存库,它提供了高度可配置的内存和磁盘存储,以及丰富的缓存策略。在MyBatis中,我们可以使用EhCache作为二级缓存的实现。要实现MyBatis与EhCache的整合,我们需要做以下几步: 1. ...

    redis详细文件

    Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存以及消息中间件的角色。...同时,合理地结合Java缓存机制,如Spring Cache,可以进一步简化开发工作,提升系统的整体效率。

    面试题全集(周瑜).pdf

    十五、Java缓存机制 * 什么是缓存机制? * 缓存穿透、缓存击穿、缓存雪崩分别是什么? * 如何避免缓存穿透、缓存击穿、缓存雪崩? 十六、Java ZooKeeper * 什么是ZooKeeper? * ZooKeeper中的领导者选举的流程是...

    清楚Java Applet缓存

    然而,这种缓存机制有时会给开发者带来困扰。当你更新了Applet的代码并重新部署后,浏览器可能仍然从缓存中加载旧版本的Applet,导致无法看到最新的功能或修复。这是因为Java插件倾向于从缓存中获取Applet的jar文件...

    java缓存文档

    总的来说,"java缓存文档"涵盖了Java缓存的多个重要方面,包括Ehcache、Memcached、Redis的使用和Java内置缓存机制的实践。通过学习这份文档,开发者将能更好地理解和掌握Java缓存技术,从而提升应用程序的性能和...

    java缓存工具 SimpleCache_java_缓存_

    6. **缓存失效通知**:当缓存中的数据被更新或删除时,SimpleCache 可能提供回调机制,以便应用程序能够及时做出反应。 7. **缓存预加载**:在应用启动时,SimpleCache 可以预先加载一部分关键数据,以提升应用的...

    Java缓存技术

    缓存机制在提高系统响应速度方面发挥着重要作用。在高并发情况下,使用缓存能够显著降低对数据库的压力,进而提高整个系统的性能。具体而言,当用户首次访问某个数据时,系统会从数据库中获取数据并将这些数据存储在...

    ListView缓存机制

    ListView是Android平台上常见的一种用于展示大量数据的控件,它通过高效的缓存机制来提高滚动时的性能,避免频繁地创建和销毁视图。在深入理解ListView缓存机制之前,我们先来了解一下ListView的基本工作原理。 ...

Global site tag (gtag.js) - Google Analytics