博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Solr httpCache 缓存分析
阅读量:6516 次
发布时间:2019-06-24

本文共 2378 字,大约阅读时间需要 7 分钟。

  hot3.png

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的值生成一个唯一的值。并写会给客户端。

更多精彩内容请关注:

关注超人学院微信二维码:172610_cEqX_2273204.jpg

转载于:https://my.oschina.net/crxy/blog/417896

你可能感兴趣的文章
30个php操作redis常用方法代码例子
查看>>
阿里PB级Kubernetes日志平台建设实践
查看>>
监听者模式实践-java事件和事件监听器
查看>>
比RBAC更好的权限认证方式(Auth类认证)
查看>>
httpd之编译安装详解
查看>>
服务器磁盘采购分析
查看>>
Java IO 之 InputStream源码
查看>>
PHP中is_callable()函数的用法详解
查看>>
Node.js股票模拟交易后台
查看>>
android动画
查看>>
新书试读_信息系统项目管理师考试考点分析与真题详解
查看>>
LVS Nginx HAProxy 优缺点
查看>>
images对象实现图片幻灯片
查看>>
Oracle 12c 日常维护
查看>>
CF 445A DZY Loves Chessboard
查看>>
Cobbler简介
查看>>
恢复 git reset -hard 的误操作
查看>>
菜鸟初始代码旅程——修改记录
查看>>
C# WinForm 文件上传下载
查看>>
【javascript】ajax请求 编码问题导致的ie浏览器在输入中文文字后没有内容,而chrome正常搜到文字...
查看>>