solr缓存学习

sor缓存缓存

虽然solr的检索速度很快,可是当搜索服务的请求变得很是复杂的时候,咱们仍是会发现搜索会出现一些性能上的问题。其实不少用户的请求颇有不少类似的地方,jvm

好比(一):它们多是不一样用户的同一个请求,或者这个用户仅仅是进行了翻页的操做;(二):用户的过滤条件会有重合的地方,好比它们在同一个类目下进行了不一样的查询;性能

针对这两个问题,其实咱们能够经过设置solr的缓存来使查询速度变快从而提升性能。spa

 

solr的cache类型:xml

(1)filterCache过滤器缓存:这个缓存主要是针对fq进行的。一般用户会在一个固定的业务场景下进行不一样的查询,而启用这个缓存会大大地提升搜索性能。对象

(2)queryResultCache查询结果缓存:须要知足query、filterquery sortFiled一致才行。若是屡次执行一个查询,其实看到的是缓存取出的结果,并非去索引的结果。对要耗费大量计算资源的查询来讲,这是一种比较高效的解决方式。索引

queryResultWindowSize:咱们能够去设置查询结果窗口大小,好比咱们每页展现20个商品,若是用户大多数状况下去浏览第一页第二页那么咱们能够把queryResultWindowSize设置为40,这样就能够避免用户查看第二页时再次执行查询请求。(这个能够经过跑数据来决定咱们要设置的值)内存

enableLazyFieldLoading:通常咱们置为true,避免拉到没必要要的字段资源

(3)documentCache文档缓存:里面存储了文档的内容,若是索引更新的比较快,结果文档也常在变化,那么文档缓存可能会把资源耗费在对应用程序性能无益的地方。可是若是索引更新频率很低,那么文档缓存可能有助于提升应用程序的性能。文档

(4)filedCache字段值缓存:这个缓存主要是lucene来管理,而不是solr来管理。它提供了能够快速访问字段值的途径,主要是用在sort和facet是使用。

(4)filedValueCache多值字段缓存:主要用于存储multivalued Field,同上面的filedCache,它是solr特有的缓存,若是你不配置在solrconfig.xml那么它会自动初始化为(初始大小10,最大10000),这样可能会有内存溢出的风险。

 

搜索器:

在这里就不对搜索器进行很细致的介绍了,由于本文档不是主要介绍搜索器的,而搜索器的一些操做可能会用到缓存且对缓存形成影响,在这提一下。

1.当你在对solr进行一次硬提交(普通提交)的时候,你能够选择打开搜索器或者不打开,若是不打开可能会致使搜索不可见,由于搜索器存的只是索引的只读视图,当你对索引改变时,须要从新启动一个搜索器来从新加载只读视图。而一个新的搜索器的加载,会致使缓存的失效,致使那段时间用户的体验不好。

2.当你进行软提交的时候cache(filterCache、queryResultCache、fieldvaluecache )都会失效,若是进行一个很频繁的软提交,那么缓存几乎是不可用的

3.若是你打开了opensearch为true那么你能够选择对搜索器进行预热。

这里有一个连接很好地讲了软提交和硬提交https://hacpai.com/article/1489704451481?m=0。

 

缓存大小:

从缓存大小来讲,咱们不能把缓存设置的太大,不然它会消耗jvm的大部份内存。solr可以将全部的缓存都保存在内存中,不会溢出到硬盘上,solr为了控制缓存的大小要求每一个缓存都要配置它们的上限。当数量达到上限时,solr将采用LRU最久未使用置换法或LFU最近最少使用置换法回收一部分空间。

LRU:当缓存达到上限且须要添加新对象时,solr将会置换缓存中最久未被请求过的对象。

LFU:该方法根据缓存对象被请求频率的高低决定缓存对象被回收的次序。(过滤器缓存是使用这个的好地方)

注意:通常咱们会有一个误区,就是若是咱们内存足够,缓存应该设置得越大越好。其实否则,由于一旦缓存失效,那么JVM须要进行大量的垃圾回收工做,若是不对缓存作合适的调整那么可能会致使JVM长时间在作垃圾回收工做,而暂停服务。

相关文章
相关标签/搜索