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 缓存
关注超人学院微信二维码:微信