1. 程式人生 > >獲取memcache快取下所有的鍵值對資訊

獲取memcache快取下所有的鍵值對資訊

        快取是可以在很大程度上提高網站的響應速度和整體效能的工具,但是如果貿然直接修改資料庫的資料但是沒有更新快取就很容易使得前端頁面上仍然載入髒資料的,因此,對於一個WEB站點來說,快取內容的管理顯得尤為重要,筆者最近做的小專案中用到了memcache,也是時下一個比較流行的分散式快取管理系統,其中,筆者的站點需要從另外一個站點讀取資料並將讀到的資料載入至筆者系統的快取中,筆者希望能夠有一個視覺化的頁面去檢視,搜尋和修改快取裡的內容,儘管可用於管理memcache的開源站點有很多,但是無奈公司不太信任這些開源網站的安全性,因此筆者試圖做一個小頁面能夠顯示站點快取下所有的內容,以便能夠快捷的管理其內容。

其中,在php提供的用於與memcached互動的擴充套件模組中有memcached與memcache,前者提供方法getAllKeys用於遍歷所有Memcached伺服器上的key,但是並不保證原子操作,而後者卻沒有提供任何方法。因此筆者根據官方文件中給出的示例,並結合筆者的分頁邏輯,寫出一個工具方法,用來獲取memcache下所有的KEY-VALUE內容。

該方法適用於單臺快取伺服器試圖取出所有的鍵值對!

<?php

	/**
	 * [獲取快取中的資訊]
	 * @param  [type] $start [開始索引]
	 * @param  [type] $limit [長度]
	 * @return [type]        [description]
	 */
	function getAllKeyAndValueInCache($start = 0,$limit){
		try{
			global $_MC;
			$list = array();

			$cacheStr = CACHE_SERVER.":".CACHE_PORT;
			$items = $_MC->getExtendedStats('items');
			$items = $items[$cacheStr]['items'];
			$i = 0;
			foreach($items as $key => $values){
				$number = $key;
				$str = $_MC->getExtendedStats("cachedump",$number,0);
				$line = $str[$cacheStr];
				if( is_array($line) && count($line) > 0){
					foreach($line as $key => $value){
						$list[$i] = array(
							'key' => $key,
							'value' => htmlentities(json_encode($_MC->get($key),JSON_UNESCAPED_UNICODE),ENT_QUOTES)
						);

						$i++;
					}
				}
			}

			$result = array();
			$result[0] = array_slice($list, $start, $limit);
			$result[1] = count($list); 

			return $result;

		}catch (Exception $e){
			//丟擲異常
		}
	}
?>


不過筆者發現這樣使用memcache取出所有鍵值對兒,效能確實不高,有時還很慢,因此筆者建議,如果試圖去管理這些快取的內容,最好還是直接使用已知的key去拉去快取中的內容,這樣效能是會好很多的!