用JSP构建异步缓存模式

用JSP构建异步缓存模式,jsp,caching,asynchronous,Jsp,Caching,Asynchronous,我有一个JSP,将需要大约8分钟来呈现。代码逻辑本身无法提高效率(它将经常更新,基本上由一个头发尖尖的老板来更新)。我试着用缓存层包装它,比如 <%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="oscache" %> <oscache:cache time="60"> <div class="pagecontent"> ..... my logic </div> </osc

我有一个JSP,将需要大约8分钟来呈现。代码逻辑本身无法提高效率(它将经常更新,基本上由一个头发尖尖的老板来更新)。我试着用缓存层包装它,比如

<%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="oscache" %>
<oscache:cache time="60">
  <div class="pagecontent">
  ..... my logic
  </div>
</oscache:cache>

..... 我的逻辑
这很好,直到60秒结束。之后的下一个查询将阻塞,直到8分钟的渲染再次完成。我需要一种构建模式的方法,比如:

  • 如果缓存中没有动态内容的版本,则运行实际逻辑(并为后续请求填充缓存)
  • 如果缓存中有未过期版本的动态内容,则从缓存中输出JSP逻辑
  • 如果缓存中存在过期版本的动态内容,则从缓存中提供JSP逻辑的输出仍然,并在后台运行JSP逻辑,以便缓存对用户透明地更新-避免用户必须等待8分钟
  • 我发现至少EHCache可以进行一些异步缓存更新,但遗憾的是,它似乎没有应用到JSP标记上。。。此外,我还必须为JSP的实际逻辑引入10-20个参数,其中一些参数应该用作缓存的键


    非常感谢代码示例和/或指针。坦率地说,我并不在乎提供的解决方案是否极其丑陋。我只需要一个简单的5分钟缓存,异步缓存更新将一些参数作为一个键考虑进去。

    如果缓存的数据在所有用户中都是通用的,那么使用JSTL
    application
    scope可以缓存JSP片段。如果是每个用户,则
    会话
    范围

    同时,使用另一个变量记录缓存刷新时间戳,或者反过来记录到期时间。下面是一个例子:

    <c:if test="${empty cachedData}">
    <c:set var="cachedData" scope="application">
    <%-- Cached JSP content goes here -->
    </c:set>
    <c:set var="cachedRefreshTimestamp"
      value="<%= new Long(new java.util.Date().getTime()) %>"
      scope="application"/>
    </c:if>
    
    
    
    后来:

    如果(系统当前时间+5)>cachedrefreshttimestamp,则在单独的循环中再次获取数据,覆盖回cachedData,并更新cachedrefreshttimestamp