簡體   English   中英

如何在spring java應用程序中緩存圖像文件?

[英]How to cache image files in spring java application?

在我面向公眾的 Web 應用程序中,圖像(連同元數據)的顯示方式就像使用 Spring 框架開發的相冊應用程序一樣。 我想要的是將文件系統中的所有圖像(數以千計)緩存在 RAM 中,以便在 HTML 中遇到類似圖像標記時:

<img src="images/folder1/subfolder/myimage.jpg" />

圖像是從緩存內存中提供的,而不是由 tomcat 網絡服務器從磁盤提供的,以實現高性能。

如何在 spring 框架 web 應用程序中實現這一點?

如果使用 mongodb 來存儲圖像元數據等 Web 內容,如何在同一個 Spring Web 應用程序中實現上述場景?

所以有兩個答案,一個不涉及 mongodb,一個涉及 mongodb。

Spring Cache 最初很容易設置,並且是非常可配置的。 如果您提供專用緩存庫,它將使用它; 如果沒有,它將使用內存中的並發哈希映射來保存緩存數據。 您將需要一個專用控制器,它可能類似於:

@ResponseBody
@RequestMapping(value = "/images/{path}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
@Cacheable("images")
public byte[] image(@PathVariable path) throws IOException {
    InputStream in = servletContext.getResourceAsStream("images/"+path);
    return IOUtils.toByteArray(in);
}

這第一次加載圖像被調用並緩存它。 每次調用方法時都會返回相同的參數緩存值。

我首先要確保這個圖像緩存實際上是對性能的提升。 但是如果你決定使用它,可能你想使用一個專用的緩存庫,而不是可以很快填滿堆的默認庫。 但當然這取決於應用程序。

閱讀 Spring Cache https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html

@Christaan​​ 的答案也可以擴展到將外部引用的圖像本地緩存到您的解決方案中,以在圈養環境中使用。 例如:

@ResponseBody
@RequestMapping(value = "/sample-image", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
@Cacheable("images")
public byte[] image() throws IOException {

            URL url = new URL("http://iminsys.com/assets/images/pages/about/edrich.jpg");
            InputStream in = new BufferedInputStream(url.openStream());
            return FileCopyUtils.copyToByteArray(in); // using Spring's FileCopyUtils
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM