我有一个java文件服务器,通过http提供文件。每个文件都可以通过ID进行唯一寻址:
http://fileserver/id/123455555
我希望为此添加一个缓存层,以便最常访问的文件保留在内存中。我还想控制缓存的总大小。我想为此使用ehcache或oscache,但我之前只使用它们来缓存序列化对象。它们是一个不错的选择,还有建立文件缓存的其他考虑因素吗?
修改
感谢所有答案。关于文件服务器的更多细节,以简化(或复杂化)问题:
编辑2 虽然它自己的服务器对它支持的文件类型没有任何限制,但文件主要是图像(jpg,gif,pgn),Word,excel,PDF不大于10Mb。
答案 0 :(得分:2)
番石榴缓存? http://code.google.com/p/guava-libraries/wiki/CachesExplained
答案 1 :(得分:1)
Ehcache也提供了进行网络缓存的功能。您可能想尝试http://www.ehcache.org/documentation/user-guide/web-caching
答案 2 :(得分:1)
无论如何,操作系统会将所有最近最少使用的文件保存在内存中。
答案 3 :(得分:1)
到目前为止,您最有效的缓存机制是将缓存移出您自己的服务器并尽可能靠近客户端(数据位置;))。有效地使用HTTP协议允许客户端和缓存代理在适当的时候进行缓存:
编辑:您更新后说文件永远不会被修改,因此我建议将Expires标头设置为远期日期。
......现在更直接地回答这个问题......
我对EhCache的体验是一个很好的选择,可以满足您提到的要求。
你提到“最常访问的文件留在内存中”所以似乎有必要提一下,根据我做过的一些性能测试(几年前现在),LFU(最不常用)驱逐策略是很多比缓存写入时LRU(最近最少使用)慢 - 实际上慢了30倍。这是LFU与LRU相比复杂的产物。
最好检查一下您在生产中真正看到的数据使用模式,以了解哪种驱逐策略最适合您。在大多数情况下,我建议将LRU作为起点,因为它在缓存足够大并且没有异常数据访问的重大突发的情况下接近LFU。
我没有使用OSCache,所以不能在那里说什么。