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 緩存
關注超人學院微信二維碼:微信