Memcached源码分析- LRU原理以及get/set命令(6)

1 原理图

Memcached源码分析- LRU原理以及get/set命令(6)_第1张图片

2 LRU原理

每一个slabclass都会对应一个heads指针指向item链表的头部,tails指向items链表的尾部。组成一个LRU链表,链表是按照访问时间顺序排列的。

1 get请求命令
1 通过hv = hash(key, nkey),通过hash函数计算出key的32位整数值。
2 通过索引数组,it = primary_hashtable[hv & hashmask(hashpower)],找到索引数组对应的头指针。
3 通过h_next链表,依次遍历查找数据判断是否能够找到对应的key的item。
4 如果没有找到,返回空。
5 如果找到,但是item的缓存日期过期了。从hashTable中的h_next链表中删除;从LRU(head,tail)链表中删除对应的item;清理item数组,然后将item加入到它所对应的slabclass的空闲链表中
6 如果找到了,但是没有过期,使用次数加1;item从LRU队列中删除;将item放到LRU队列的表头(do_item_update方法)

2 set请求命令
1 根据item的key大小和value大小,查找到对应的slabs_clsid。
2 search = tails[id];从LRU链表的尾部开始查找。
3 如果找到过期的item,将其分配给新的item使用。调用do_item_update更新LRU链表。更新hashTable。
4 如果没有找到过期的item,尝试分配一个空闲的item,如果分配失败,直接从尾部删除一个item给新的item使用。调用do_item_update更新LRU链表。更新hashTable。

你可能感兴趣的:(memcached)