设为首页 收藏本站
查看: 812|回复: 0

[经验分享] Lucene/Solr Dev 3 Solr Cache and Load Balance

[复制链接]

尚未签到

发表于 2016-12-15 10:31:46 | 显示全部楼层 |阅读模式
  Warmming up:
  Analysing the solr src class, which packaged in org.apache.solr.search. There are two implementations of cache available for Solr, LRUCache, based on a synchronized LinkedHashMap, and FastLRUCache, based on a ConcurrentHashMap. FastLRUCache has faster gets and slower puts in single threaded operation and thus is generally faster than LRUCache when the hit ratio of the cache is high (> 75%). And then i will delve into the whloe solr's cache, let's start from FastLRUCache FIFO strategy.
  FastLRUCache FIFO strategy:
  FIFO means first come first in, which is a very common strategy in software design, i will give a experiment directly to account for FIFO strategy.
  In order to make the experiment result more persuasively, we should add a row code in Solr's org.apache.solr.common.util.ConcurrentLRUCache<K,V>, we add the below code

  //add by kylin
System.out.println(key +  " " + map.keySet());
  to ConcurrentLRUCache's put(K key, V val), yes, it's just a output sentence, use to output the cache's size before a put has coming.
  and then we run the below code;

public void testFastLRUCacheFIFO() {
FastLRUCache cache = new FastLRUCache();
Map map = new HashMap();
map.put("size", "3");
CacheRegenerator regenerator = new CacheRegenerator() {
public boolean regenerateItem(SolrIndexSearcher newSearcher,
SolrCache newCache, SolrCache oldCache, Object oldKey,
Object oldVal) throws IOException {
newCache.put(oldKey, oldVal);
return true;
}};
Object obj = cache.init(map, null, regenerator);
cache.setState(SolrCache.State.LIVE);
for (int i = 1; i < 10; i++) {
cache.put(i , "" + i);
}
}
  map.put("size", "3"), this is very imporant, is the key factor of  FastLRUCache FIFO, implement the code, and the result is:

1 [1]
2 [2, 1]
3 [2, 1, 3]
4 [3, 4]
5 [5, 3, 4]
6 [6, 5]
7 [6, 5, 7]
8 [7, 8]
9 [7, 8, 9]
  Through the result data, we can know that the latest record was saved, but this not totally FIFO, because the Out number is count by the size you have set:Out numer = size * 10%, but the minimal Out size is 2. so we can count the above Out number(3 * 10% = 0, 0 < 2, so Out num is 2).
  change the above code, we look at the warming mechenism.

public void test() throws IOException {
FastLRUCache cache = new FastLRUCache();
Map map = new HashMap();
map.put("size", "100");
map.put("initialSize", "10");
map.put("autowarmCount", "30");
CacheRegenerator regenerator = new CacheRegenerator() {
public boolean regenerateItem(SolrIndexSearcher newSearcher,
SolrCache newCache, SolrCache oldCache, Object oldKey,
Object oldVal) throws IOException {
newCache.put(oldKey, oldVal);
return true;
}};
Object obj = cache.init(map, null, regenerator);
cache.setState(SolrCache.State.LIVE);
for (int i = 1; i < 102; i++) {
cache.put(i , "" + i);
}
System.out.println(cache.get(10));
System.out.println(cache.get(11));
FastLRUCache cacheNew = new FastLRUCache();
cacheNew.init(map, obj, regenerator);
cacheNew.warm(null, cache);
cacheNew.setState(SolrCache.State.LIVE);
cache.close();
cacheNew.put(103, "103");
System.out.println(cacheNew.get(72));
System.out.println(cacheNew.get(73));
}
  and also i give the implement result:

null
11
null
73
  Anaysing the result:
  The size = 100, so 100 * 10% = 10, OutNumber = 10, when the 101th recod has added, the first came 10 recod were remove, so the null printed, and then 11 was printed.
  The autowarmCount = 30, so when a new SolrSearcher coming, it will be bould with new Searcher, 102-30=72, So when you get 72 in new Searcher, the null is printed,and if you get 73, the responding value is printed.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314657-1-1.html 上篇帖子: 数据库数据导入到solr 下篇帖子: [译]lucene&solr 2011年盘点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表