以前有同事需要我清除memcache緩存,我總是直接使用kill命令結束掉這個進程,后來才知道有更簡單的方法,來清除memcachd的緩存,記錄一下,以備不時之需.
1.首先使用ssh命令登錄到memcached所在服務器,命令如下:
#ssh root@192.168.1.1
輸入root密碼后可登錄對應的服務器;
2.使用telnet命令后接tomcat服務配置文件中指定的memcached啟動端口,代碼如下:
#telnet localhost 11211
之后顯示:
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
3.此時輸入如下內容并回車即可清除緩存內容,代碼如下:
flush_all
4.最后退出telnet使用quit命令,再exit退出遠程主機.
php清除過期緩存,代碼如下:
- /**
- * Memcached的過期內存回收
- */
- class mem_dtor extends Memcache
- {
- private $server_id;
- public function __construct($host,$port)
- {
- $this->server_id = "$host:$port";
- $this->connect($host,$port);
- }
- // 回收所有過期的內存
- public function gc()
- {
- $t = time();
- $_this = $this;
- $func = function($key,$info) use ($t,$_this)
- {
- if($info[1] - $t delete($key);
- }
- };
- $this->lists($func);
- }
- // 查看所有緩存內容的信息
- public function info()
- {
- $t = time();
- $func = function($key,$info) use ($t)
- {
- echo $key,' => Exp:',$info[1] - $t,"n"; //查看緩存對象的剩余過期時間
- };
- $this->lists($func);
- }
- private function lists($func)
- {
- $sid = $this->server_id;
- $items = $this->getExtendedStats('items'); //獲取memcached狀態
- foreach($items[$sid]['items'] as $slab_id => $slab) //獲取指定server id 的 所有Slab
- {
- $item = $this->getExtendedStats('cachedump',$slab_id,0); //遍歷所有Slab
- foreach($item[$sid] as $key => $info) //獲取Slab中緩存對象信息
- {//開源代碼Vevb.com
- $func($key,$info);
- }
- }
- }
- }
- $mem = new mem_dtor('127.0.0.1',11211);
- $mem->info();//查看狀態
- $mem->gc(); //回收
memcache緩存的批量刪除方案
memcache默認只支持使用delete(key)和 flush_all,這兩種方法都太極端了,不能滿足用戶的特定需求,如,批量刪除‘aaaaaaaa_'開頭的所有緩存,這個時候該怎么辦?
1 getExtendStats 遍歷所有item,刪除指定的key(不推薦)
網上有對應的php代碼和perl程序,感興趣的可以看看,在本地測試時可以使用,但是在真是服務器上請不要使用.
2 memcache結合DB
方法:每次set緩存時,將key值存入數據庫,在要刪除緩存時查詢數據庫,查詢出對應的信息,在memcache中將其刪除,缺點:浪費數據褲磁盤.
3 memcache偽命名空間,推薦
memcache默認不提供命名空間,但可以設置一個全局變量,來模擬命名空間,代碼如下:
- <?php
- //生成一個用來保存 namespace 的 key
- $ns_key = $memcache->get("foo_namespace_key");
- //如果 key 不存在,則創建,默認使用當前的時間戳作為標識
- if($ns_key===false) $memcache->set("foo_namespace_key",time());
- //根據 namespace_key 生成真正的 key,確保是唯一的key值
- $my_key = "foo_".$ns_key.$otherParms;
- //然后利用拼接的my_key值設置你需要緩存的各種數據
- $memcache->set($my_key,$value,false,expire);
- //或者key值獲得以前存儲的緩存
- $memcaceh->get($my_key);
- //需要刪除整個 namespace 里的對象的時候,如:更改數據庫或者刪除某些信息后
- //將ns_key的值改變,則以后在訪問緩存時,以前時間的將永遠不會別訪問到,以此來實現批量刪除緩存
- $memcache->set("foo_namespace_key",time());
- ?>
新聞熱點
疑難解答