在面向公众的Web应用程序中,图像(以及元数据)显示在使用Spring框架开发的相册应用程序中。我想要的是在RAM中缓存来自文件系统的所有图像(数千个),以便在HTML中遇到类似图像标记时:
<img src="images/folder1/subfolder/myimage.jpg" />
图像由缓存内存提供,而不是由tomcat webserver从磁盘提供,以获得高性能。
如何在Spring框架Web应用程序中实现这一点?
如果mongodb用于存储图片元数据等网页内容,那么如何在同一个春季网络应用中实现上述方案?
所以有两个答案,一个涉及没有mongodb,一个涉及mongodb。
答案 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
}