solr缓存学习

sor缓存

虽然solr的检索速度很快,但是当搜索服务的请求变得非常复杂的时候,我们还是会发现搜索会出现一些性能上的问题。其实很多用户的请求很有很多相似的地方,

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

针对这两个问题,其实我们可以通过设置solr的缓存来使查询速度变快从而提高性能。

搜索器:

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

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长时间在做垃圾回收工作,而暂停服务。

solr的cache类型:

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

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

这里提到一点,我们可以去设置查询结果窗口大小,比如我们每页展示20个商品,如果用户大多数情况下去浏览第一页第二页那么我们可以把queryResultWindowSize设置为40,这样就可以避免用户查看第二页时再次执行查询请求。(这个可以通过跑数据来决定我们要设置的值)

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

(4)filedValueCache字段值缓存:

时间: 2024-08-02 21:44:38

solr缓存学习的相关文章

TimesTen 应用层数据库缓存学习:12. 管理缓存环境

缓存和复制代理的启停和状态查看 cache agent的作用是将监控Oracle中数据的变化,并更新到TimesTen.因此,对于只读和AWT缓存组,cache agent都是必需的. cache agent的启停 ttisql> call ttcachestart ttisql> call ttcachestop 或者 $ ttadmin -cachestart DSN $ ttadmin -cachestop DSN replication agent的启停 ttisql> call

缓存学习小结(一)

(Java)缓存的分为文件缓存或磁盘缓存(disc cache)和内存缓存(memory cache)两种:文件缓存就是把数据存储在本地磁盘上,内存缓存通常是一个map.缓存的作用就是把首次从网络的获取数据保存起来,当再次访问的时候可以直接从缓存中获取数据而不是从网络中重新加载.可以减少系统开销,提高响应速度. 单独使用内存缓存和单独使用文件缓存应用的执行流程如下所示: 内存缓存和文件缓存同时使用的情况下的流程图大致如下所示: 需要注意的是,当从网络加载数据的时候用一个线程或者提供一个线程池来完

TimesTen 应用层数据库缓存学习:17. 全局数据缓存(cache grid)的高可用性

概述 本文有两个目的: 1. 介绍TimesTen Global Cache Grid的高可用性 2. 给出了一个简单的建立和清理Global Cache Grid的过程,前面已经有一篇文章: TimesTen 应用层数据库缓存学习:13. 全局数据缓存(cache grid),但那个Cache Group太复杂 建立一个简单的Global Cache Grid 首先建立两个TimesTen instance,一个为tt1122, 一个为ttnew. 之所以建立两个实例,是为了停instance

C# 缓存学习第一天

缓存应用目的:缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 1.缓存的引用空间:System.Web.Caching; 缓存命名空间主要提供三种操作:缓存数据对象.对象的缓存依赖和数据库的缓存依赖.其中缓存任何对象都使用一个类Cache,但当缓存发生改变时,普通对象和数据库对象的依赖处理不同. 2.管理缓存类:Cache Cache类用来存储数据对象,并

solr缓存需要注意的问题

fieldValueCache默认是存在的.如果没有在solrConfig.xml中配置,那么 其初始大小10,最大10000,不会autowarm .在PC上开发时,会有内存溢出的风险. solr缓存需要注意的问题

C# 缓存学习总结

昨天整理了一下缓存的基本用法,和缓存依赖类 CacheDependency类的使用,今天整理一下缓存的数据库依赖类SqlCacheDependency 1.数据库依赖类SqlCacheDependency 数据库缓存依赖主要解决的是当数据库的内容发生改变时,如何及时通知缓存,并更新缓存中的数据的问题. 语法定义: SqlCacheDependency类主要的构造函数如下: public SqlCacheDependency(string database,string table) 其中参数一代

spring boot guava cache 缓存学习

http://blog.csdn.net/hy245120020/article/details/78065676 ************************************************************ spring boot guava cache 缓存学习 自定义key 自定义全局key过期时间,缓存个数 针对单个key自定义过期时间,缓存个数 引入依赖 <dependency> <groupId>org.springframework.boo

分布式缓存学习总结

一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 三.Memcached基础原理 四.Memcache下载与安装 五.MencacheHelper.cs 示例使用 结合Session与项目配置缓存 六.Redis和Memcache的区别总结 一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 首先先讲讲为何要缓存,在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已

solr入门学习笔记1 --- solr的安装启动

solr是apache一个基于lucene开发的的完整搜索引擎解决方案.lucene只提供了建立索引和搜索的API接口,相当于一个内核,没有提供实际可用的将外部数据转化为lucene索引的方案或接口.而solr则提供了这样的一个功能,用户只需做简单的配置,即可将外部数据如数据库.office文档.PDF.页面文件等转化为索引文件,然后就可以基于这些数据和solar封闭的查询接口进行数据搜索. solr使用HTTP的方式外外部程序进行交互.即用户做好配置之后,将之发布为一个web服务,其它程序可以