1. 程式人生 > >Memcached--資料的過期和刪除機制

Memcached--資料的過期和刪除機制

刪除過期Item

  Memcached為每個item設定一個過期時間,但不是到期就把item從記憶體刪除,而是訪問item時,如果到了有效期,才把item從記憶體中刪除。

item *do_item_get_notedeleted(const char*key,const size_t nkey,bool *delete_locked){
             item *it = assoc_find(key ,nkey);
             if(delete_locked) *delete_locked =false;
             if(it != NULL && (it
->it_flags & ITEM_DELETED)){ if(!item_delete_lock_over(it)){ if(delete_locked)*delete_locked = true; it = null; } } if(it != null &&settings.oldest_live != 0 && settings.oldest_live <= current_time&& it
-> time <= settings.oldest_live){ do_item_unlink(it); it = null; } /*------------------------------------------*/ if(it != null && it ->exptime != 0 && it -> exptime <= current_time){ do_item_unlink(it
); it = null; } /*------------------------------------------*/ if(!it = null ){ it -> refcount ++; DEBUG_REFCNT(it,'+'); } return it; }

  使用do_item_get_notedeleted函式在memcached中查詢指定的item,從上面程式碼可知,當item過期時間早於當前時間時,便會刪除此item。

  注: 延遲刪除過期的iten到查詢進行,可以提高memcached的效率。這樣不必每時每刻檢查過期item,從而提高CPU工作效率。這種模式稱之為惰性失效。

使用LRU演算法淘汰資料

  當Memcached使用記憶體大於設定的最大記憶體使用時,為了騰出記憶體空間來存放新的資料項,Memcached會啟動LRU演算法淘汰舊的資料項。
使用slabs_alloc函式申請記憶體失敗時,就開始淘汰資料了。淘汰規則是,從資料項列表尾部開始遍歷,在列表中查詢一個引用計數器為0的item,把此item釋放掉。

  為什麼要從item列表尾部開始遍歷呢? 因為memcached會把剛剛訪問過的item放到item列表頭部,所以尾部的item都是沒有或很少訪問的,這就是LRU演算法的精髓。

  如果在item列表找不到計數器為0的item,就查詢一個3小時沒有訪問過的item。把他釋放,如果還是找不到,就返回NULL(申請記憶體失敗)。

  從上面的分析可以知道,當記憶體不足時,memcached會把訪問比較少或者一段時間沒有訪問的item淘汰,以便騰出記憶體空間存放新的item。

注:即使某個key設定的是永久有效,也一樣會被刪除,即為:老資料被踢現象。