有時我在測試或其它應用時希望能快速的清除memcache緩衝,下面我來總結了幾種清除memcache中的緩衝的一些方法,希望方法對大家有所哦
以前有同事需要我清除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.此時輸入如下內容並斷行符號即可清除緩衝內容:
4.最後退出telnet使用quit命令,再exit退出遠程主機。
清除到期緩衝
| 代碼如下 |
複製代碼 |
/** * 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中緩衝對象資訊 { $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預設不提供命名空間,但可以設定一個全域變數,來類比命名空間,代碼如下:
| 代碼如下 |
複製代碼 |
//產生一個用來儲存 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()); ?>
|
以上是個人見解,歡迎拍板
http://www.bkjia.com/PHPjc/629897.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629897.htmlTechArticle有時我在測試或其它應用時希望能快速的清除memcache緩衝,下面我來總結了幾種清除memcache中的緩衝的一些方法,希望方法對大家有所哦 以前...