Java Web站点下载Cache API

时间:2011-10-04 10:59:09

标签: java web-applications web browser-cache

我在我的java应用程序中使用2个模块,它们下载相同的网页。 所以实际上该网站下载了两次。 为了避免这种情况,我是否可以附加一些缓存层,因此实际上只下载了1个网站副本。

我很乐意看到Java端的缓存,如果不能像以后那样在某个Web缓存代理或其他方面实现

2 个答案:

答案 0 :(得分:0)

如果两个'模块'在同一个jvm中,因此可以访问每个内存,请尝试基于单例的'缓存'。我倾向于使用HtmlSnippit缓存来缓存重复的HTML snippits并取得巨大成功:

public class Testing {
    public static void main(String[] args) {

    String html = "<div>The quick brown fox jumps over the lazy dog</div>";

    /* Access via the getInstance() getter */
    HtmlSnippitCache.getInstance().putSnippit("FOXY", html);

    /* Or via local var */
    HtmlSnippitCache cache = HtmlSnippitCache.getInstance();
    String moreHtml = cache.getSnippit("FOXY");

    System.out.println(moreHtml);
}

public static class HtmlSnippitCache {
    /* Singleton implementation */
    private static HtmlSnippitCache instance;

    public static HtmlSnippitCache getInstance() {
        if (HtmlSnippitCache.instance == null)
            synchronized (HtmlSnippitCache.class) {
                if (HtmlSnippitCache.instance == null)
                    HtmlSnippitCache.instance = new HtmlSnippitCache();
            }
        return HtmlSnippitCache.instance;
    }

    /* Ensure only local construction. */
    private HtmlSnippitCache() {}

    /* Clas Impl */
    private HashMap<String, String> map = new HashMap<String, String>();

    public boolean containsSnippit(String key) {
        return map.containsKey(key);
    }

    public String getSnippit(String key) {
        return map.get(key);
    }

    public String putSnippit(String key, String value) {
        return map.put(key, value);
    }

        public int size() {
            return map.size();
        }
    }
}

现在,getSnippit()putSnippit()方法可能需要synchronized以某种方式确保线程安全,但这是另一个讨论(参数?):)

(示例应该开箱即用。)

答案 1 :(得分:0)

这可能稍微偏离主题,因为此解决方案使用spring:

您可以使用ehcache-spring-annotations进行缓存而无需任何代码。

基本上,您在ehcache.xml中定义了一个缓存:

<ehcache>
    ...
    <cache 
       name="htmlCache" 
       maxElementsInMemory="10" 
       eternal="true" 
       overflowToDisk="false" />
</ehcache>

配置以在spring应用程序上下文中使用缓存注释:

<ehcache:annotation-driven />

<ehcache:config cache-manager="cacheManager"/>

<bean 
    id="cacheManager"    
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>

并注释您的代码以自动缓存:

@Cacheable(cacheName = "htmlCache")
public String getHtml(String url) {
    ...
}

然后,这将基于其参数(getHtml)缓存url方法的结果,所以在第二次使用相同的url调用方法时,结果将直接来自缓存。