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

ace*_*ace 1 java spring caching mongodb

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

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

图像是从缓存内存中提供的,而不是由 tomcat 网络服务器从磁盘提供的,以实现高性能。

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

如果使用 mongodb 来存储图像元数据等 Web 内容,如何在同一个 Spring Web 应用程序中实现上述场景?

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

Cri*_*scu 7

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);
}
Run Code Online (Sandbox Code Playgroud)

这将在第一次调用时加载图像并缓存它。每次调用方法时都会返回相同的参数缓存值。

我首先要确保这个图像缓存实际上是对性能的提升。但是如果你决定使用它,可能你想使用一个专用的缓存库,而不是可以很快填满堆的默认库。但当然这取决于应用程序。

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