本文主要研究一下Elasticsearch的CachedSupplier

CachedSupplier

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/CachedSupplier.java

public final class CachedSupplier<T> implements Supplier<T> {private Supplier<T> supplier;private T result;private boolean resultSet;public CachedSupplier(Supplier<T> supplier) {this.supplier = supplier;}@Overridepublic synchronized T get() {if (resultSet == false) {result = supplier.get();resultSet = true;}return result;}}
复制代码
  • CachedSupplier实现了Supplier接口,它包装了一个supplier,其get方法只调用一次原始supplier的get方法并缓存其结果,下次调用直接返回缓存的结果

实例

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/search/query/TopDocsCollectorContext.java

    abstract static class SimpleTopDocsCollectorContext extends TopDocsCollectorContext {private static TopDocsCollector<?> createCollector(@Nullable SortAndFormats sortAndFormats, int numHits,@Nullable ScoreDoc searchAfter, int hitCountThreshold) {if (sortAndFormats == null) {return TopScoreDocCollector.create(numHits, searchAfter, hitCountThreshold);} else {return TopFieldCollector.create(sortAndFormats.sort, numHits, (FieldDoc) searchAfter, hitCountThreshold);}}protected final @Nullable SortAndFormats sortAndFormats;private final Collector collector;private final Supplier<TotalHits> totalHitsSupplier;private final Supplier<TopDocs> topDocsSupplier;private final Supplier<Float> maxScoreSupplier;/*** Ctr* @param reader The index reader* @param query The Lucene query* @param sortAndFormats The query sort* @param numHits The number of top hits to retrieve* @param searchAfter The doc this request should "search after"* @param trackMaxScore True if max score should be tracked* @param trackTotalHitsUpTo True if the total number of hits should be tracked* @param hasFilterCollector True if the collector chain contains at least one collector that can filters document*/private SimpleTopDocsCollectorContext(IndexReader reader,Query query,@Nullable SortAndFormats sortAndFormats,@Nullable ScoreDoc searchAfter,int numHits,boolean trackMaxScore,int trackTotalHitsUpTo,boolean hasFilterCollector) throws IOException {super(REASON_SEARCH_TOP_HITS, numHits);this.sortAndFormats = sortAndFormats;final TopDocsCollector<?> topDocsCollector;if (trackTotalHitsUpTo == SearchContext.TRACK_TOTAL_HITS_DISABLED) {// don't compute hit counts via the collectortopDocsCollector = createCollector(sortAndFormats, numHits, searchAfter, 1);topDocsSupplier = new CachedSupplier<>(topDocsCollector::topDocs);totalHitsSupplier = () -> new TotalHits(0, TotalHits.Relation.GREATER_THAN_OR_EQUAL_TO);} else {// implicit total hit counts are valid only when there is no filter collector in the chainfinal int hitCount = hasFilterCollector ? -1 : shortcutTotalHitCount(reader, query);if (hitCount == -1) {topDocsCollector = createCollector(sortAndFormats, numHits, searchAfter, trackTotalHitsUpTo);topDocsSupplier = new CachedSupplier<>(topDocsCollector::topDocs);totalHitsSupplier = () -> topDocsSupplier.get().totalHits;} else {// don't compute hit counts via the collectortopDocsCollector = createCollector(sortAndFormats, numHits, searchAfter, 1);topDocsSupplier = new CachedSupplier<>(topDocsCollector::topDocs);totalHitsSupplier = () -> new TotalHits(hitCount, TotalHits.Relation.EQUAL_TO);}}MaxScoreCollector maxScoreCollector = null;if (sortAndFormats == null) {maxScoreSupplier = () -> {TopDocs topDocs = topDocsSupplier.get();if (topDocs.scoreDocs.length == 0) {return Float.NaN;} else {return topDocs.scoreDocs[0].score;}};} else if (trackMaxScore) {maxScoreCollector = new MaxScoreCollector();maxScoreSupplier = maxScoreCollector::getMaxScore;} else {maxScoreSupplier = () -> Float.NaN;}this.collector = MultiCollector.wrap(topDocsCollector, maxScoreCollector);}@OverrideCollector create(Collector in) {assert in == null;return collector;}TopDocsAndMaxScore newTopDocs() {TopDocs in = topDocsSupplier.get();float maxScore = maxScoreSupplier.get();final TopDocs newTopDocs;if (in instanceof TopFieldDocs) {TopFieldDocs fieldDocs = (TopFieldDocs) in;newTopDocs = new TopFieldDocs(totalHitsSupplier.get(), fieldDocs.scoreDocs, fieldDocs.fields);} else {newTopDocs = new TopDocs(totalHitsSupplier.get(), in.scoreDocs);}return new TopDocsAndMaxScore(newTopDocs, maxScore);}@Overridevoid postProcess(QuerySearchResult result) throws IOException {final TopDocsAndMaxScore topDocs = newTopDocs();result.topDocs(topDocs, sortAndFormats == null ? null : sortAndFormats.formats);}}
复制代码
  • SimpleTopDocsCollectorContext的构造器使用CachedSupplier创建了topDocsSupplier;之后newTopDocs方法会调用topDocsSupplier.get()来获取TopDocs

小结

CachedSupplier实现了Supplier接口,它包装了一个supplier,其get方法只调用一次原始supplier的get方法并缓存其结果,下次调用直接返回缓存的结果

doc

  • CachedSupplier

转载于:https://juejin.im/post/5cfa71da6fb9a07ead59ecd5

聊聊Elasticsearch的CachedSupplier相关推荐

  1. 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage

    序 本文主要研究一下Elasticsearch的ExponentiallyWeightedMovingAverage ExponentiallyWeightedMovingAverage elasti ...

  2. 聊聊elasticsearch的RoutingService

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究一下elasticsearch的RoutingService RoutingService elasticsearch ...

  3. 聊聊Elasticsearch的TimedRunnable

    序 本文主要研究一下Elasticsearch的TimedRunnable TimedRunnable elasticsearch-7.0.1/server/src/main/java/org/ela ...

  4. 聊聊Elasticsearch的Iterables

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究一下Elasticsearch的Iterables Iterables elasticsearch-7.0.1/ser ...

  5. 聊聊Elasticsearch RestClient的RequestLogger

    序 本文主要研究一下Elasticsearch RestClient的RequestLogger RequestLogger elasticsearch-7.0.1/client/rest/src/m ...

  6. 聊聊Elasticsearch的BootstrapCheck

    序 本文主要研究一下Elasticsearch的BootstrapCheck BootstrapCheck elasticsearch-7.0.1/server/src/main/java/org/e ...

  7. 聊聊Elasticsearch的NodesSniffer

    序 本文主要研究一下Elasticsearch的NodesSniffer NodesSniffer elasticsearch-7.0.1/client/sniffer/src/main/java/o ...

  8. 聊聊Elasticsearch的RunOnce

    序 本文主要研究一下Elasticsearch的RunOnce RunOnce elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/c ...

  9. 【ElasticSearch从入门到放弃系列 零】ElasticSearch看这一篇就够了

    大数据时代系统和业务每分每秒都产生成千上万的数据,其存储一定是不能通过关系型数据库了,当然因为数据的持久性也不能存储到内存型Nosql数据库Redis中,我们通常会将这些数据存储在能够不丢失数据的非关 ...

最新文章

  1. DedeCMS筛选简单实现方法不改后台源文件
  2. 用java开发一个Hello Word系统内核
  3. 【极客blog图文讲解】ruby以及Jekyll的环境配置(针对mac linux)
  4. kl距离 java_信息量、熵、最大熵、联合熵、条件熵、相对熵、互信息。
  5. 一文说通C#中的异步编程
  6. 协议转换器安全使用须知
  7. GDAL库进度信息编写示例
  8. Bailian2886 能被3除尽的数之和【进制】
  9. 记载学习Android的开发过程
  10. Mac VLC播放器怎么禁止使用硬件解码?
  11. 谷歌中国算法比赛解题报告 APAC2017C
  12. VMware虚拟机XP系统安装教程
  13. 砌体的弹性模量计算_砌体弹性模量等参数的取值.doc
  14. 通过UDP解析域名 DNS解析
  15. 海报生成的Java方法
  16. 绘制一个stm32最小系统的电路原理图;完成STM32+SD卡 的系统原理图设计
  17. 计算机应用大赛宣传稿,江苏开放大学计算机应用基础中国名城宣传片
  18. 通过QQ邮件发送文档到kindle,kindle收不到的问题
  19. (转载)TRS的WCM6漏洞权限绕过以及绕过密码的登陆方式
  20. mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...

热门文章

  1. 如何将多个word文档的内容合并到一个文档 多html转word
  2. zabbix监控哪些东西_监控系统选型,一篇全搞定
  3. vs code react-native 安卓调试_实战|C++在vscode上的调试配置
  4. 设置只能开启一个程序实例
  5. Redis实现分布式锁2
  6. Binder IPC的权限控制
  7. 6位大师浅谈未来三年大数据的发展
  8. C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案
  9. Java从入门到精通07-排序
  10. python-socket模块介绍