##MemCache管理与应用
> MemCache系统是通过客户端发送的命令(set/get)管理“内存中缓存”的数据。客户端在于MemCached服务器建立连接以后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符key,存取操作均通过这个key进行,保存到memcached中的对象实际上是放置在内存中的,而并不是保存在缓存文件中的,这也是为什么MemCached能够如此告诉快速的原因。
![memcached工作原理](https://img.kancloud.cn/b9/27/b927c38120224dcdf1610520d24bce5c_350x300.jpg)
###MemCache在WEB中的应用:
1、使用MemCache作为中间缓冲层减少数据库的压力
2、MemCache分布式的应用
###MemCache的安装及管理
1、Linux下安装MemCache软件
省略...
2、Window下安装MemCache软件
下载MemCache二进制数据包;
解压后放在某个磁盘的分区下面:如D:\
执行安装命令:
D:\>memcached.exe -d install
![安装memcached](https://img.kancloud.cn/db/67/db673049e59214917795a411d6213bf1_667x292.png)
通过计算机管理的“服务”中查看刚安装的memcached软件。
![计算机管理的服务](https://img.kancloud.cn/d2/a6/d2a664f104678ffad8ac40cff11c1cd8_737x309.png)
启动memcached服务器:
D:\>memcached.exe -d start
![启动memcached服务器](https://img.kancloud.cn/b3/60/b360af93236523526a1f9908226a4a90_563x277.png)
停止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
![memcached服务器的管理](https://img.kancloud.cn/f2/7b/f27b4f99a7781b70abc6e9fffa802946_533x182.png)
###使用Telnet作为memcached的客户端管理
1、连接memcached服务器
telnet localhost 11211
![连接memcached服务器](https://img.kancloud.cn/c5/49/c54959a8226c4fe9462e53ae4cbf21fd_539x220.png)
2、基本的memcached客户端命令
stats:当前所有memcached服务器运行的状态信息
add:添加一个数据到服务器
set:替换一个已经存在的数据。如果数据不存在,则和add命令相同。
get:从服务器端提取指定的数据。
delete:删除指定的单个数据。清除所有的数据,可以使用flush_all指令。
3、数据管理指令
添加(add)、修改(set)
<命令><键><标记><有效期><数据长度>
键:key
标记:一个16位的无符号整型数据,用来设置服务器端和客户端的一些交互操作
有效期:0表示无限制,单位是秒
![数据管理指令](https://img.kancloud.cn/52/0f/520fc125bf0ba4a7e91095cc4b3c6a75_635x383.png)
删除(delete)和获取(get)
<命令><键>
![删除数据管理指令](https://img.kancloud.cn/81/1d/811df870378bee86ff93016a349c2696_581x268.png)
###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服务器中获取数据](https://img.kancloud.cn/1d/ab/1dab76abd28ae43022e89dde49f92c1c_419x258.png)
####分布式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、当缓存失效后,再读取数据库中的最新数据。
![memcached实际案例](https://img.kancloud.cn/32/fc/32fc71db782cff6d3048435caf271b51_649x524.png)