程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 清除memcache中的緩存一些方法總結

清除memcache中的緩存一些方法總結

編輯:關於PHP編程

有時我在測試或其它應用時希望能快速的清除memcache緩存,下面我來總結了幾種清除memcache中的緩存的一些方法,希望方法對大家有所哦

以前有同事需要我清除memcache緩存,我總是直接使用kill命令結束掉這個進程,後來才知道有更簡單的方法,來清除memcachd的緩存,記錄一下,以備不時之需:

1.首先使用ssh命令登錄到memcached所在服務器,命令如下:

 代碼如下 復制代碼

#ssh [email protected]

輸入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默認不提供命名空間,但可以設置一個全局變量,來模擬命名空間,代碼如下:

 代碼如下 復制代碼

<?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());
?>  

以上是個人見解,歡迎拍板

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved