[Solr源码分析]LRUCache和FastLRUCache实现分析

星期一, 八月 9th, 2010

在 [Solr 实践]Solr Cache使用介绍及分析 一文我有对Solr的LRUCache和FastLRUCache做了一些介绍,本文在此基础对其实现做些补充。
1、LRUCache的实现分析
在分析LRUCache前先对LinkedHashMap做些介绍。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, boolean accessOrder)指定。所以,对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。
以get操作为例,如果是LRU顺序(accessOrder为true),Entry的recordAccess方法就调整get到的Entry到链表的头部去:

public V get(Object key) {
Entry<K,V> e = (Entry<K,V>)getEntry(key);
if (e [...]

[Solr源码分析]Solr复制类ReplicationHandler实现简要分析

星期天, 七月 25th, 2010

在上一文《solr ReplicationHandler使用介绍》的基础上,本文接着对solr的ReplicationHandler实现细节做些分析,这个分析原则上没有摘取大段代码,窃以为摘了代码后未见得有很好的阐述效果,但不摘取后窃又发现,阐述的效果依旧不好。归结起来,还是窃的表达不够深入浅出所致。闲言少叙,直接上内容。

zoie DocIDMapperImpl类实现分析

星期五, 七月 16th, 2010

有网友留言询问我对zoie的DocIDMapperImpl实现是否有了解。说实话,之前看zoie也只是大面上的,知道DocIDMapperImpl的用处,但没有仔细分析它的算法。就趁着夜深人静,把这个类好好琢磨了下。但我得承认,看这种伤脑筋的算法让我有些吃不消,下面就列出我对它的大致分析,如果有不恰当的地方,也望指正。

还是说下DocIDMapperImpl的作用吧。在zoie中,uid和lucene的docid有一一对应关系。从docid到uid的映射很简单,就是分配个maxdoc大小的数组,索引位置是docid,值是uid。这样做也是因为docid是从小到大自增的,大小总有限。但uid是long型的,使用数组反映射是不行了,一个直接的选择是使用hashmap。不过zoie为了节约空间,使用了更有效的算法,也就是下面的类。

C++智能指针之auto_ptr实现分析

星期三, 二月 24th, 2010

C++的动态内存的分配与释放是个挺折磨人的事情,尤其当业务逻辑变得复杂时(比如一堆try catch中,各catch里需要做delete 掉相关的堆上分配的内存),极有可能产生内存泄露的情况,尤其是一些很难触发的分支条件。C++中提供了智能指针作为可选的解决方案, C++标准库中自带的智能指针是auto_ptr,它在大多数场景下是满足需求的。针对auto_ptr的缺点,boost和loki两套库都扩展出一些智能指针,并且boost中有两位幸运儿入选了tr1中(std::tr1::shared_ptr,std::tr1::weak_ptr)。本文就gcc中auto_ptr的实现做些分析,以飨自己。笔记采用注释源码的方式。

豆瓣beansdb源码浅析

星期六, 二月 20th, 2010

Beansdb是豆瓣荣誉出品的分布式key-value存储系统,该系统是对经典的Dynamo的简化。项目地址:http://code.google.com/p/beansdb/,其上的
Inside BeansDB.pdf文档是对beansdb的很好的介绍。

Beansdb的CAP特点表现为:

1)分布式的,伸缩性比较好(P)

2)最终一致的(C),可能出现短时间内的数据不一致。

3)高可用的(A),部分节点出现故障不影响服务。

Beansdb在豆瓣内部有着广泛的使用,比如图片文件、小媒体文件、profile、properties等等。Beansdb不像GFS等分布式存储系统,一般不用于存储百兆以上单位的大数据。