Solr httpCache 緩存分析

solr httpCache 主要是用來判斷當前的搜索請求request的請求頭header的If-Modified-Since和If-None-Match的兩個值,
If-Modified-Since和If-None-Match這兩個header信息能夠參考個人另外一篇博客
有關Last-Modified 與 If-Modified-Since
  要想Solr的httpCache緩存生效,須要修改solr的配置文件solrconfig.xml,由於solr的過濾器會作以下判斷:
HttpCacheHeaderUtil.setCacheControlHeader(config, resp, reqMethod);
if (config.getHttpCachingConfig().isNever304() ||
                !HttpCacheHeaderUtil.doCacheHeaderValidation(solrReq, req, reqMethod, resp)){
  這裏是沒有httpcache緩存要作的全部工做。
}
要緩存,首先讓solr生成header信息,這個代碼就是HttpCacheHeaderUtil.setCacheControlHeader裏完成的,
代碼以下:


    if (Method.POST==method || Method.OTHER==method) {
      return;
    }
    final String cc = conf.getHttpCachingConfig().getCacheControlHeader();
    if (null != cc) {
      resp.setHeader("Cache-Control", cc);
    }
    Long maxAge = conf.getHttpCachingConfig().getMaxAge();
    if (null != maxAge) {
      resp.setDateHeader("Expires", System.currentTimeMillis()
                         + (maxAge * 1000L));
    }


可是solr默認是沒有啓用的,須要改solrconfig配置文件,改動以下:


<httpCaching never304="true" >
         <cacheControl>max-age=30, public</cacheControl> 
</httpCaching>


<!--
       <httpCaching lastModifiedFrom="openTime"
                    etagSeed="Solr">
         <cacheControl>max-age=30, public</cacheControl> 
       </httpCaching>
-->


兩個能夠任選一個,若是兩個都選,則第一個有效。


把這個httpcache的註釋去掉就能夠,solr在初始化時取cacheControl這個值的。上面代碼CC就是cacheControl的值,
從上面代碼能夠看出,max-age的值寫到header的Expires表示該資源的有效期,單位沒秒。
public 表示能夠全部的資源。若是cc的值爲空的話,SOlr就不會生成header信息,致使在客戶端下次請求時相關的header信息就位空。


config.getHttpCachingConfig().isNever304() 的值就是配置文件solrconfig.xml中


<httpCaching never304="true" /> 的值,默認是true,從上面的if判斷能夠看出,爲true的話,就是不啓用httpCache緩存。
因此要啓用httpcache緩存,先把這個值改成false,這裏改好了,solr就根據head頭來判斷是否要直接用httpcache了。這個就是在HttpCacheHeaderUtil.doCacheHeaderValidation裏判斷實現的.代碼以下:


   if (Method.POST==reqMethod || Method.OTHER==reqMethod) {
         return false;
    }
    
    final long lastMod = HttpCacheHeaderUtil.calcLastModified(solrReq);
    final String etag = HttpCacheHeaderUtil.calcEtag(solrReq);
    
    resp.setDateHeader("Last-Modified", lastMod);
    resp.setHeader("ETag", etag);


    if (checkETagValidators(req, resp, reqMethod, etag)) {
      return true;
    }


    if (checkLastModValidators(req, resp, lastMod)) {
      return true;
    }
從上面能夠看出,若是是post請求,不會啓用httpCache緩存,
lastMod 的值是索引最近修改時間,這裏是根據取的是<httpCaching lastModifiedFrom="openTime"   etagSeed="Solr">
裏lastModifiedFrom的值來計算,當爲opentime時,lastModifiedFrom爲solr index的打開時間。若是沒有,默認也是。
etagSeed的值是用來計算etag 的,根據etag的值生成一個惟一的值。並寫會給客戶端。

更多精彩內容請關注:http://bbs.superwu.cn 緩存

關注超人學院微信二維碼:微信

相關文章
相關標籤/搜索