memcached对item的管理采用了哈希表的方式进行管理, 采用的扩展哈希。memcached判断是否需要扩展比较简单, 就是判断当前的item个数是否超过桶数的3/2,而没有象berkeley DB中那样根据冲突的个数来扩展哈希:可能认为哈希算法比较好, 能比较平均的分布哈希键值(哈希算法: http://burtleburtle.net/bob/c/lookup3.c , http://burtleburtle.net/bob/hash/doobs.html)
if (! expanding && hash_items > (hashsize(hashpower) * 3) / 2)
{
assoc_start_expand();
}
memcached扩展哈希的方式是启动一个线程(assoc_maintenance_thread)来扩展和重构哈希表; 线程的同步采用条件变量(pthread_cond_wait, pthread_cond_signal)来实现线程同步.
memcached在哈希扩展中维护了两个哈希桶: old_hashtable和primary_hashtable; old_hashtable是扩展以前的哈希桶, primary_hashtable是正在扩展的哈希桶; 在扩展过程中不断的从old_hashtable中移到primary_hashtable中.因此在哈希扩展过程中如果有对哈希的操作需要判断扩展的进程来判断需要在那个哈希桶中查找(大部分是有互斥的)。