Tomcat 静态缓存“cacheTtl”
Posted
技术标签:
【中文标题】Tomcat 静态缓存“cacheTtl”【英文标题】:Tomcat static cache "cacheTtl" 【发布时间】:2021-11-03 08:08:56 【问题描述】:谁能给我更多关于 Tomcat 静态缓存中使用的“cacheTtl”的详细信息?我在documentation 中看到它被提及
重新验证缓存条目之间的时间量(以毫秒为单位)。如果未指定,则默认值为 5000(5 秒)。
“缓存条目的重新验证”究竟是什么意思?如果我有太多缓存资源,这会影响我的应用程序的性能吗?
提前致谢!
【问题讨论】:
【参考方案1】:“重新验证” 只是意味着再次从磁盘读取。因此,如果客户端请求静态资源:
如果资源在小于cacheTtl
秒前被读取,则将返回缓存在Java堆内存中的数据,
如果资源在cacheTtl
秒前被读取,Tomcat 将再次从磁盘读取数据(并缓存)。
由于内存访问比磁盘访问快一个数量级(参见this question),如果缓存未满,则更长的 TTL 意味着更好的性能。当缓存变满时(超过 90% 的容量),Tomcat 可以在缓存条目在达到其 TTL 之前驱逐它们。
然而,Tomcat 缓存对性能的真正影响要复杂得多,因为:
现代操作系统自己缓存打开的文件(使用应用程序不使用的 RAM),因此 “磁盘读取” 实际上可能几乎与 “堆内存读取”一样快。减少 Tomcat 的内存有时可能会提高性能, 现代操作系统有一个sendfile 系统调用:如果您想按原样将文件返回给客户端,操作系统可以为您完成(比 Java 代码快得多)。对于大于 48 KiB 的文件,Tomcat 的DefaultServlet
默认使用 sendfile
(参见 documentation)。没有必要缓存比这更大的文件。
【讨论】:
以上是关于Tomcat 静态缓存“cacheTtl”的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)
Tomcat如何快速响应静态资源(DefaultServlet+浏览器缓存)