一:为什么要使用memcached
瓶颈:互联网发展,特别在web2.0兴起之后,传统数据库开始出现瓶颈
1:对数据库的高并发读写
2:对海量数据库的处理(海量数据查找)
memcache 是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,已提高动态web应用的速度和扩展。
保存在memcache的对象实际上是放置在内存中,并不是保存在 cache 文件中的,这也是memcache高效的原因之一,从内存数据要比硬盘快很多倍。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
缺点:存储对象并不是持久的,服务器停止数据就会丢失。
memcache本身是为了缓存而设计的服务器,内存达到一定值,就会使用LRU算法自动删除不常使用的缓存。

二:安装memcached的服务器
memcached官网: http://memcached.org

两种安装方式,1:源码包安装 2:yum源安装
(1)源码包安装:
1.memcached-1.4.25 //Memcached服务端.
2.memcached-2.2.0 //Memcached服务PHP的扩展之一Memcached扩展,其实Memcached扩展有两种,还有一种叫Memcache,不过Memcached比Memcache功能更强大. Memcached不支持windows(https://pecl.php.net/package/memcached)
memcache-3.0.8 //Memcached服务PHP的扩展之一Memcache扩展 有windows扩展(https://pecl.php.net/package/memcache)
3.libevent-1.4.14b-stable //Memcached服务端的依赖包.
4.libmemcached-1.0.18 //Memcached扩展的依赖包.
注php memcached客户端除此两种之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client,但是效率会比扩展库稍差一些。
php的memcached客户端(memcache memcached)的区别参考:
http://blog.csdn.net/juan083/article/details/49432711
http://blog.csdn.net/baidu_30000217/article/details/53586536
http://blog.csdn.net/lein_wang/article/details/52756859
这三篇文章已经分析的很透测了

#先安装Memcached服务端的依赖包.
tar -zxvf libevent-1.4.14b-stable.tar.gz
cd libevent-1.4.14b-stable
./configure --prefix=/usr/local/libevent
make
make install

#然后安装Memcached扩展的依赖包.
https://launchpad.net/libmemcached
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached

#接着安装Memcached服务端.
tar -zxvf memcached-1.4.25
cd memcached-1.4.25
./configure -prefix=/usr/local/memcached -with-libevent=/usr/local/libevent
make && make install

#启动memcached
cd /usr/local/memcached/bin/memcached
./memcached -d -m 100 -u root -l 114.215.112.83 -p 11211 -c 512 -P /tmp/memcached.pid

#接着安装Memcached服务PHP的扩展之一Memcached扩展
http://pecl.php.net/package/memcached
tar -zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
/usr/local/php/bin/phpize
./configure --prefix=/usr/local/memcached --with-php- config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
make && make install

linux安装memcached
#接着安装Memcached服务PHP的扩展之一Memcache扩展
https://pecl.php.net/package/memcache
wget pecl.php.net/get/memcache-3.0.8.tgz
tar -zxvf memcache-3.0.8 .tgz
cd memcache-3.0.8
/usr/local/php/bin/phpize
./configure --prefix=/usr/local/memcache --with-php- config=/usr/local/php/bin/php-config
make && make install

linux安装memcached
cd /usr/local/php/lib/
vim php.ini
extension=memcache.so
extension=memcached.so
重启apache

使用memcache常用操作:
<?php
//连接Memcache
$mem = new Memcache;
$mem->connect("114.215.112.83", 11211);

//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";

//替换数据
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";

//保存数组数据
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";

//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

//关闭连接
$mem->close();
?>

使用memcached连接
使用memcached-client.php链接

<
?php
// 包含 memcached 类文件
require_once('memcached-client.php');
// 选项设置
$options = array(
'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
'debug' => true, //是否打开 debug
'compress_threshold' => 10240, //超过多少字节的数据时进行压缩
'persistant' => false //是否使用持久连接
);
// 创建 memcached 对象实例
$mc = new memcached($options);
// 设置此脚本使用的唯一标识符
$key = 'mykey';
// 往 memcached 中写入对象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);
// 替换已写入的对象数据值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);
// 删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);
?>
在一台或者多台机器启用一个或者多个进程,这里是在一台机器启用两个进程,使用两个端口:
./memcached -d -m 100 -u root -l 114.215.112.83 -p 11211 -c 512 -P /tmp/memcached.pid
./memcached -d -m 100 -u root -l 114.215.112.83 -p 11212 -c 512 -P /tmp/memcached.pid
<?php
//连接Memcache
$mem = new Memcache;
$mem->addServer("114.215.112.83", 11211);
$mem->addServer("114.215.112.83", 11212);
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";
//保存数组数据
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//关闭连接
$mem->close();
?>

Memcached一些特性和限制
• 在 Memcached 中可以保存的item数据量是没有限制的,只有内存足够
• Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程
• 最大30天的数据过期时间, 设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA
60*60*24*30 控制
• 最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250 控制
• 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576 进行控制,
它是默认的slab大小
• 最大同时连接数是200,通过 conn_init()中的freetotal 进行控制,最大软连接数是1024,通过
settings.maxconns=1024 进行控制
• 跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式

(2)yum源安装:
安装: yum search memcached 搜索memcached,有了,可以进行安装了 yum -y install memcached
memcache关联php安装 :
yum -y install php-pecl-memcache
安装php扩展:
先装:yum install php-devel
后装:pecl install memcache
//PHP的Memcached扩展,其实Memcached扩展有两种,还有一种叫Memcache,不过Memcached比Memcache功能更强大.

启动memcached的服务端:
yum安装默认情况下memcached安装到/usr/local/bin下,进入安装目录之后,
./memcached -d -m 100 -u root -l 192.168.80.130 -p 11211 -c 512 -P /tmp/memcached.pid
获取运行状态:ps -ef|grep memcached

memcached -h可以查看memcached的参数

注:
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB.这里是100MB,默认是64MB
-u是运行Memcache的用户,这里是root.
-l是监听的服务器IP地址,默认是本机.
-p是设置Memcache监听的端口,默认是11211,最好是1024以上的端口.
-c选项是最大运行的并发连接数,默认是1024,这里设置512,按照你服务器的负载量来设定.
-P是设置保存Memcache的pid文件位置.
-h 打印帮助信息
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息

使用telnet连接memcached服务:telnet 192.168.80.130 11211
stats查看状态,flush_all:清楚缓存
查看memcached状态的基本命令,通过这个命令可以看到如下信息:

linux安装memcached

 

注:
STAT pid 22459 进程ID
STAT uptime 1027046 服务器运行秒数
STAT time 1273043062 服务器当前unix时间戳
STAT version 1.4.4 服务器版本
STAT pointer_size 64 操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.040000 进程累计用户时间
STAT rusage_system 0.260000 进程累计系统时间
STAT curr_connections 10 当前打开连接数
STAT total_connections 82 曾打开的连接总数
STAT connection_structures 13 服务器分配的连接结构数
STAT cmd_get 54 执行get命令总数
STAT cmd_set 34 执行set命令总数
STAT cmd_flush 3 指向flush_all命令总数
STAT get_hits 9 get命中次数
STAT get_misses 45 get未命中次数
STAT delete_misses 5 delete未命中次数
STAT delete_hits 1 delete命中次数
STAT incr_misses 0 incr未命中次数
STAT incr_hits 0 incr命中次数
STAT decr_misses 0 decr未命中次数
STAT decr_hits 0 decr命中次数
STAT cas_misses 0 cas未命中次数
STAT cas_hits 0 cas命中次数
STAT cas_badval 0 使用擦拭次数
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 15785 读取字节总数
STAT bytes_written 15222 写入字节总数
STAT limit_maxbytes 1048576 分配的内存数(字节)
STAT accepting_conns 1 目前接受的链接数
STAT listen_disabled_num 0
STAT threads 4 线程数
STAT conn_yields 0
STAT bytes 0 存储item字节数
STAT curr_items 0 item个数
STAT total_items 34 item总数
STAT evictions 0 为获取空间删除item的总数

退出telnet ctrl+]
然后再输入quit

linux安装memcached

 

在php.ini中添加 extension=memcache.so
则在phpinfo中出现

linux安装memcached

 

selinux是一套linux的安全系统,它指定了应用程序可以访问的磁盘文件、网络端口等等。如果装有selinux,那么默认的selinux 会阻止memcache程序访问11211端口,所以必须对selinux进行配置才行。
编辑 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled 或者SELINUX=0

测试:
< ?php
$mem = new Memcache; //创建memecache对象
$dd = $mem->connect('192.168.1.104','11211') or die('connect die'); //连接memcached服务器
$mem->set('key','this is memcache test'); //存储数据
$val = $mem->get('key'); //获取数据
echo $val;//输出数据
$mem->delete('key');//删除数据
$mem->flush();//强制刷新全部缓存,即清空memcahced服务器
$mem->close();//断开与memcached服务器连接
?>

linux安装memcached

 

在一台或者多台机器启用一个或者多个进程,这里是在一台机器启
用两个进程,使用两个端口:
#./memcached -d -u nobody -m 512 127.0.0.1 -p 11211
#./memcached -d -u nobody -m 512 127.0.0.1 -p 11212
源码打印?
<?php
//连接Memcache
$mem = new Memcache;
$mem->addServer("localhost", 11211);
$mem->addServer("localhost", 11212);
//保存数据
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";
//保存数组数据
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//关闭连接
$mem->close();
?>