##MemCache管理與應用
> MemCache系統是通過客戶端發送的命令(set/get)管理“內存中緩存”的數據。客戶端在于MemCached服務器建立連接以后,接下來的事情就是存取對象了,每個被存取的對象都有一個唯一的標識符key,存取操作均通過這個key進行,保存到memcached中的對象實際上是放置在內存中的,而并不是保存在緩存文件中的,這也是為什么MemCached能夠如此告訴快速的原因。

###MemCache在WEB中的應用:
1、使用MemCache作為中間緩沖層減少數據庫的壓力
2、MemCache分布式的應用
###MemCache的安裝及管理
1、Linux下安裝MemCache軟件
省略...
2、Window下安裝MemCache軟件
下載MemCache二進制數據包;
解壓后放在某個磁盤的分區下面:如D:\
執行安裝命令:
D:\>memcached.exe -d install

通過計算機管理的“服務”中查看剛安裝的memcached軟件。

啟動memcached服務器:
D:\>memcached.exe -d start

停止memcached服務器的運行:
D:\>memcached.exe -d stop
3、memcached服務器的管理
一些常用的管理選項:
例如:memcached.exe -d -m 2048 -l localhost -p 11211
-d 以守護程序方式運行memcached
-m 2048 2GB內存
-l localhost 監聽本機
端口 11211

###使用Telnet作為memcached的客戶端管理
1、連接memcached服務器
telnet localhost 11211

2、基本的memcached客戶端命令
stats:當前所有memcached服務器運行的狀態信息
add:添加一個數據到服務器
set:替換一個已經存在的數據。如果數據不存在,則和add命令相同。
get:從服務器端提取指定的數據。
delete:刪除指定的單個數據。清除所有的數據,可以使用flush_all指令。
3、數據管理指令
添加(add)、修改(set)
<命令><鍵><標記><有效期><數據長度>
鍵:key
標記:一個16位的無符號整型數據,用來設置服務器端和客戶端的一些交互操作
有效期:0表示無限制,單位是秒

刪除(delete)和獲取(get)
<命令><鍵>

###PHP的memcached管理接口
1、安裝PHP中的MemCache應用程序擴展接口
安裝文件后,在配置文件中加入“extension=php_memcache.dll”
2、PHP程序使用MemCache應用程序接口的方法實例
<?php
//實例化得到memcache對象
$mem = new Memcache();
//連接memcached服務器
$mem->connect('127.0.0.1',11211);
//賦值
$mem->set('name','jack',2,1000);
//取值
echo $mem->get('name');
結果輸出:jack
<?php
//得到memcache對象
$mem = new Memcache();
//連接
$mem->connect('127.0.0.1', 11211);
$list = array('name'=>'jack', 'age'=>18);
//賦值 存進去是什么樣子,讀取出來就是什么樣
$mem->set('list', $list);
//取值
$res = $mem->get('list');
echo '<pre>';
print_r($res);
echo '</pre>';
輸出結果如下:

####分布式memcached服務器
//添加多臺服務器
$mem->addServer('192.168.12.6',11211);
$mem->addServer('192.168.12.251',11211);
$mem->addServer('192.168.12.25',11211);
###MemCache的實例應用
1、從數據庫讀取用戶表的PHP代碼
<?php
$mem = new Memcache();
$mem->connect('127.0.0.1', 11211);
$sql = "select id, username, password, addtime from shop_user";
$fileName = md5($sql);
echo $fileName;
$userlist = $mem->get($fileName);
if (empty($userlist)){
$link = mysqli_connect('127.0.0.1','root', '', 'ishop');
mysqli_set_charset($link,'utf8');
sleep(3);
$res = mysqli_query($link, $sql);
if ($res) {
while ($row = mysqli_fetch_assoc($res)) {
$userlist[] = $row;
}
}
// bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
// 向memcached中設置值,設置失效時間是10s
$mem->set($fileName, $userlist, 2, 10);
}
/*
key
要設置值的key。
var
要存儲的值,字符串和數值直接存儲,其他類型序列化后存儲。
flag
使用 MEMCACHE_COMPRESSED 指定對值進行壓縮(使用zlib)。
expire
當前寫入緩存的數據的失效時間。
*/
?>
2、HTML的數據展示代碼
<table width="600" border="1" align="center">
<caption><h2>用戶列表</h2></caption>
<tr>
<th>ID</th>
<th>UserName</th>
<th>Password</th>
<th>AddTime</th>
</tr>
<?php foreach($userlist as $v): ?>
<tr>
<td><?php echo $v['id']; ?></td>
<td><?php echo $v['username']; ?></td>
<td><?php echo $v['password']; ?></td>
<td><?php echo $v['addtime']; ?></td>
</tr>
<?php endforeach; ?>
</table>
代碼解釋:
1、第一次訪問時,$userlist數據為空,因此會讀取數據庫操作,查詢的結果會同時存儲到memcached中,$mem->set($fileName, $userlist, 2, 10); 并且設置了失效的時間為10s。
2、$userlist只要沒有失效,那么訪問該頁面,就會通過$userlist = $mem->get($fileName);來獲取存儲在memcached中的查詢結果,而不直接訪問數據庫。這樣讀取的速度就會很快。
3、當緩存失效后,再讀取數據庫中的最新數據。
