缓存文件服务器

时间:2012-05-14 06:07:17

标签: java file caching

我有一个java文件服务器,通过http提供文件。每个文件都可以通过ID进行唯一寻址:

http://fileserver/id/123455555

我希望为此添加一个缓存层,以便最常访问的文件保留在内存中。我还想控制缓存的总大小。我想为此使用ehcache或oscache,但我之前只使用它们来缓存序列化对象。它们是一个不错的选择,还有建立文件缓存的其他考虑因素吗?

修改

感谢所有答案。关于文件服务器的更多细节,以简化(或复杂化)问题:

  1. 保存文件后,永远不会修改。
  2. MD5哈希以避免在保存时重复文件。 (我是 意识到可能的碰撞和安全问题)
  3. 在Linux机器上运行的文件服务器。
  4. 编辑2 虽然它自己的服务器对它支持的文件类型没有任何限制,但文件主要是图像(jpg,gif,pgn),Word,excel,PDF不大于10Mb。

4 个答案:

答案 0 :(得分:2)

番石榴缓存? http://code.google.com/p/guava-libraries/wiki/CachesExplained

  • 漂亮的API
  • 基于时间的驱逐
  • 基于规模的驱逐

答案 1 :(得分:1)

Ehcache也提供了进行网络缓存的功能。您可能想尝试http://www.ehcache.org/documentation/user-guide/web-caching

答案 2 :(得分:1)

恕我直言,你最好利用操作系统磁盘缓存,因为它有几个优点。

  • 操作系统可以完成所有实际工作,这简单得多。
  • 操作系统可以使用所有可用的可用内存,这可能会因系统的其他内容而异。
  • 您不会加倍使用磁盘缓存(因为它是磁盘缓存)。

无论如何,操作系统会将所有最近最少使用的文件保存在内存中。

答案 3 :(得分:1)

利用HTTP协议

到目前为止,您最有效的缓存机制是将缓存移出您自己的服务器并尽可能靠近客户端(数据位置;))。有效地使用HTTP协议允许客户端和缓存代理在适当的时候进行缓存:

  • 使用每个文件内容的某些功能设置ETag(例如MD5Sum) - 也缓存此信息,因此您不需要在每个服务上重新计算!
  • 根据需要设置Expires / Last-Modified / Cache-Control标头

编辑:您更新后说文件永远不会被修改,因此我建议将Expires标头设置为远期日期。

......现在更直接地回答这个问题......

ehcache的

我对EhCache的体验是一个很好的选择,可以满足您提到的要求。

你提到“最常访问的文件留在内存中”所以似乎有必要提一下,根据我做过的一些性能测试(几年前现在),LFU(最不常用)驱逐策略是很多比缓存写入时LRU(最近最少使用)慢 - 实际上慢了30倍。这是LFU与LRU相比复杂的产物。

最好检查一下您在生产中真正看到的数据使用模式,以了解哪种驱逐策略最适合您。在大多数情况下,我建议将LRU作为起点,因为它在缓存足够大并且没有异常数据访问的重大突发的情况下接近LFU。

OSCache的

我没有使用OSCache,所以不能在那里说什么。

其他考虑因素

  1. 在他的回答中,Peter Lawrey建议使用操作系统缓存。虽然这意味着你从java到native的读取都要付出代价,但我认为这个想法有很大的优点,因为它避免了Java堆中的一个重要的缓存问题:垃圾收集器有额外的工作来拖网大堆。 (另一种解决方案是使用堆外缓存,例如通过BigMemory,但它有自己的权衡)
  2. 如果内容是可压缩的,您可能需要考虑缓存文件的压缩(gzip)版本(否则每次服务时都会重新压缩它!)。这是一个与使用OS磁盘缓存相反的参数。当然还有其他一些与压缩有关的警告(例如内容足够大以保证压缩和压缩得相当好)所以它确实取决于这些文件中的内容。