一、Memcached介绍

  • 国外社区网站Live Journal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态Web站点性能。官方站点http://memcached.org

  • 基于C/S架构,协议简单

  • 基于Libevent的事件处理

  • 自主内存存储处理(Slab allowcation)

  • 数据过期方式:Lazy Expiration和LRU


二、Memcached流程图

减少对MySQL的读取次数

spacer.gifwKiom1eVY0XS10WeAAGOCw6MYr0001.png-wh_50


Slab allocation

  • Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab.

  • Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-l参数来指定。

  • Slab是由多个Page组成的,Page按照指定大小切割成多个chunk

spacer.gifwKioL1eVY1XwPdcRAAJRAg0Pkug087.png-wh_50


Growth factor

  • memcached在启动时通过-f选项可以指定Growth Factor因子。该值控制chunk大小的差异。默认值为1.25

  • 通过memcached-tool查看指定memcached实例的不同slab状态,可以看到个ltem所占大小(chunk大小)差距为1.25

  • 命令:#memcached-tool 127.0.0.1:11211 display


Memcached数据过期方式

  • Lazy Expiration

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

  • LRU

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新纪录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,就是删除“最近很少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的使用角度来看,该模型十分理想。


三、Memcached安装

1.安装扩展源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-6.repo    
yum clean all
yum makecache

#安装阿里yum源及扩展源


2.安装Memcached包及依赖包

yum install -y libevent memcached libmemcached nc


3.启动memcached服务

/etc/init.d/memcached start
ps aux | grep memcached
498        1029  0.0  0.0 330844   988 ?        Ssl  10:43   0:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
netstat -tnlup| grep memcached
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      1029/memcached      
tcp        0      0 :::11211                    :::*                        LISTEN      1029/memcached      
udp        0      0 0.0.0.0:11211               0.0.0.0:*                               1029/memcached      
udp        0      0 :::11211                    :::*


4.memcached相关配置

vim /etc/sysconfig/memcached

PORT="11211"              #端口

USER="memcached"       #用户

MAXCONN="1024"          

CACHESIZE="64"       #内存

OPTIONS=""


5.memcached启动参数

-d   启动一个守护进程

-m  指定分配给memcached使用的内存数量,单位是MB

-u   指定memcached运行用户,如果当前为root,需要使用此参数

-l    指定监听的服务器IP地址

-p   指定memcached监听的端口,默认是11211

-c    指定最大运行的并发连接数,默认是1024

-P   设置memcached的PID文件


6.查看memcached运行状态

memcached-tool 127.0.0.1:11211 stats

echo stats | nc 127.0.0.1 11211

memstat --servers=127.0.0.1:11211


7.memcached基本操作

telnet 127.0.0.1 11211           #连接memcached


set key1 0 300 2    

12

STORED  

get key1

VALUE key1 0 2

12

END


memcached-tool 127.0.0.1:11211 display   #查看chunk


set :表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖

add :表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败

replace :表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

<flags> 是一个16位无符号的整数

<exptime>过期的时间


8.PHP连接memcached

#找一台LNMP或LAMP,通过php自带的pecl安装程序

/usr/local/php/bin/pecl install memcache


也可以从源码安装

wget  http://www.lishiming.net/data/p_w_upload/forum/memcache-2.2.3.tgz
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3
/usr/local/php/bin/phpize
../configure --with-php-config=/usr/local/php/bin/php-config
make && make install


安装完后会有类似这样的提示:

Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache.so'

把这个记住,然后vim /usr/local/php/etc/php.ini ,把 

extension_dir = "./"

修改为

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/"

并添加一行

extension="memcache.so"


检验

# /usr/local/php/bin/php -m

测试php脚本

wget www.apelearn.com/study_v2/.memcache.txt


mv .memcache.txt   test.php

/usr/local/php/bin/php test.php      #不要忘记安装memcached


Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array

(

    [0] => aaa

    [1] => bbb

    [2] => ccc

    [3] => ddd

)

<br>Get key1 value: <br>Get key2 value: <br>

OK


9.memcached实现session共享

vim /usr/local/php/etc/php.ini 

#搜索Session关键字,添加下面两行

session.save_handler = "memcache"

session.save_path = "tcp://127.0.0.1:11211"


或LAMP中

httpd.conf中对应的虚拟主机中添加:

php_value session.save_handler "memcache"

php_value session.save_path "tcp://127.0.0.1:11211"


或LNMP中

php-fpm.conf对应的pool中添加:

php_value[session.save_handler] = memcache

php_value[session.save_path] = "tcp://127.0.0.1:11211"



wget http://study.lishiming.net/.mem_se.txt

mv .mem_se.txt /usr/local/nginx/html/session.php

curl localhost/session.php