memcache怎麼定期刪除不常用的資料
來源:互聯網
上載者:User
memcache如何定期刪除不常用的資料
如題,如何防止memcache裡的資料無限制增長,如何?定期刪除長時間不用或使用頻率低的資料。線上等!
------解決方案--------------------
我就知道memcache可以像session或cookie那樣設個到期時間
------解決方案--------------------
定製規則;有能力可以修改memcache實現
------解決方案--------------------
memcache是在slab記憶體池的基礎上, 每個slab內維護LRU鏈表, 每個NODE具有生命期, 所有Cache的NODE組成Hash表。
memcache採用懶惰刪除機制, 其記憶體請求步驟大致是這樣一個請求鏈: 根據node的size定位到slab ---> 從該slab的LRU尾部向前尋找到期且reference==1的NODE, 如果找到, 則從hash表與LRU中unlink此NODE, 並將此NODE插入到LRU頭部並且reference置1, 將輸入存入node尾部, 重新插入到雜湊表中. 如果沒找到, 那麼會直接向slab申請新的記憶體來儲存NODE, 這也就是記憶體池的功能了, 如果申請失敗, 那麼接下來的策略是重新掃描LRU, 找出那些雖然沒有到期, 但reference==1的NODE, 直接回收使用, 這是不得已的策略. 如果這個策略都失敗了, 我印象中還有一個策略, 是對於那些生命期已經失效3天並且當前refercence != 1的結點強制回收, 我記得注釋裡說那是一個小BUG, 這樣處理是OK的, 大概意思是:somewhere refer to this node, becuase nowhere refers to it, 不知道這個BUG發生在哪裡,我當初是沒研究出來, 因為get/remove都是配對出現在memcache的各個函數裡的, 真不知道引用計數怎麼會失效3天還不為0.
所以,你看懂了沒... 也就是儘可能的把記憶體配置向外推, 程式一開始就分配了很大的malloc記憶體充當記憶體池由slab管理, 而記憶體的重用是由LRU鏈表完成的, 不是一個線程定期掃描, 而是有需求才檢測的方法, 達到了非同步效果.
------解決方案--------------------
探討
memcache是在slab記憶體池的基礎上, 每個slab內維護LRU鏈表, 每個NODE具有生命期, 所有Cache的NODE組成Hash表。
memcache採用懶惰刪除機制, 其記憶體請求步驟大致是這樣一個請求鏈: 根據node的size定位到slab ---> 從該slab的LRU尾部向前尋找到期且reference==1的NODE, 如果找到, 則從hash表與LRU中unlink此……
------解決方案--------------------
LS已經解釋的很詳細了...
一句話總結的話....
你只要在啟動memcached的時候,用-m參數設定memcached所能佔用的最大記憶體數,剩下的事情都是memcached自己搞定了,不需要你操心,它會把最沒用的資料自己扔掉
------解決方案--------------------
定期flush
------解決方案--------------------
記得java是有memcache的flush方法,php應該會有的
至於週期性事情,你可以在一個php檔案中寫入flush,在linux中crontab 定時請求,例如
*/10 */23 * * * wget -q --spider http://www.xxxx.com/statbyday/stat1.php > /dev/null 2>&1