繁体   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