我在我的java应用程序中使用2个模块,它们下载相同的网页。 所以实际上该网站下载了两次。 为了避免这种情况,我是否可以附加一些缓存层,因此实际上只下载了1个网站副本。
我很乐意看到Java端的缓存,如果不能像以后那样在某个Web缓存代理或其他方面实现
答案 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
调用方法时,结果将直接来自缓存。