清除memcache中的緩衝一些方法總結_PHP教程

來源:互聯網
上載者:User
有時我在測試或其它應用時希望能快速的清除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.此時輸入如下內容並斷行符號即可清除緩衝內容:

代碼如下 複製代碼

flush_all

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中的緩衝的一些方法,希望方法對大家有所哦 以前...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.