linux安装memcached
一:为什么要使用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

            #接着安装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

            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状态的基本命令,通过这个命令可以看到如下信息:
                
               
注:
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

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

            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服务器连接
            ?>
             

在一台或者多台机器启用一个或者多个进程,这里是在一台机器启 
用两个进程,使用两个端口: 
#./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();  
?>  
            
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号