1. 程式人生 > >Memcached原始碼分析- LRU原理以及get/set命令(6)

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。