memecache過時策略

惰性刪除+LRU淘汰php

memcache的LRU原理: 當某個單元被請求時,維護一個計數器,經過計數器來判斷最近誰最少被使用。 
注: 即便某個key 是設置的永久有效期,也同樣會被踢出來! html

memcache使用slab allocator機制來內存管理。 
slab allocator原理:先將內存劃分爲多個slab class倉庫,每一個倉庫切分紅不一樣尺寸的小塊chunk。 
須要存儲內容時候,判斷內容大小,爲其選擇合理的倉庫。算法

memcached 在啓動時能夠經過f選項指定Growth Factor 因子, 並在某種程度上控制slab 之間的差別.即各個chunk塊的大小比例。緩存

如今有114byte內存須要存放,首先memcache會檢查chunk組,找到內容大於114byte且二則差的絕對值最小的那個chunk(假設是128)。若是此時128chunk已經用完,此時並不會去使用更大當的chunk,而是將chunk爲128裏面的舊數據踢掉,以備使用。memcached

http://blog.csdn.net/hsd2012/article/details/51464847spa

 

一個Slab會有多個Page,一個page默認是1M,啓動Memcached會預分配1M,當1M的數據滿以後,若是有新數據進來,那麼會從新分配一個Page給這個slab,可是Memcached是有內存上限的,若是不能申請Page的話,這時候就要針對這個Slab再利用LRU算法剔除掉最近最少使用的數據了。.net

1,Memcached的LRU算法針對每一個Slab執行,而不是針對總體。 線程

2,數據只會存在指定的Slab中,即便該Slab已經滿了,並且更大的Slab有空間,這種狀況會在指定的Slab執行LRU算法,由於數據不會被存放到更大的Slab中。指針

過時的數據若是沒被顯式調用get,也要佔用空間。由於LRU是針對雙向鏈表前面的數據,每一個Slab由兩個指針來維護該雙向鏈表,即heads和tails指針,分別指向最老的數據和最新的數據。這就可能致使沒有過時的數據被踢。htm

http://blog.csdn.net/qianshangding0708/article/details/47980697

 

Memcached的LRU幾種策略

1. 惰性刪除。memcached通常不會主動去清除已通過期或者失效的緩存,當get請求一個item的時候,纔會去檢查item是否失效。

2. flush命令。flush命令會將全部的item設置爲失效。

3. 建立的時候檢查。Memcached會在建立ITEM的時候去LRU的鏈表尾部開始檢查,是否有失效的ITEM,若是沒有的話就從新建立。

4. LRU爬蟲。memcached默認是關閉LRU爬蟲的。LRU爬蟲是一個單獨的線程,會去清理失效的ITEM。

5. LRU淘汰。當緩存沒有內存能夠分配給新的元素的時候,memcached會從LRU鏈表的尾部開始淘汰一個ITEM,無論這個ITEM是否還在有效期都將會面臨淘汰。LRU鏈表插入緩存ITEM的時候有前後順序,因此淘汰一個ITEM也是從尾部進行 也就是先淘汰最先的ITEM。

****************   http://blog.csdn.net/initphp/article/details/44680115

 

 

 

https://www.cnblogs.com/space007/p/6114558.html

相關文章
相關標籤/搜索