如何在spring java应用程序中缓存图像文件?

时间:2018-02-12 08:39:44

标签: java spring mongodb caching

在面向公众的Web应用程序中,图像(以及元数据)显示在使用Spring框架开发的相册应用程序中。我想要的是在RAM中缓存来自文件系统的所有图像(数千个),以便在HTML中遇到类似图像标记时:

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

图像由缓存内存提供,而不是由tomcat webserver从磁盘提供,以获得高性能。

如何在Spring框架Web应用程序中实现这一点?

如果mongodb用于存储图片元数据等网页内容,那么如何在同一个春季网络应用中实现上述方案?

所以有两个答案,一个涉及没有mongodb,一个涉及mongodb。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

@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
}