一、Memcached介绍
国外社区网站Live Journal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态Web站点性能。官方站点http://memcached.org
基于C/S架构,协议简单
基于Libevent的事件处理
自主内存存储处理(Slab allowcation)
数据过期方式:Lazy Expiration和LRU
二、Memcached流程图
减少对MySQL的读取次数
Slab allocation
Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab.
Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-l参数来指定。
Slab是由多个Page组成的,Page按照指定大小切割成多个chunk
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
转载于:https://blog.51cto.com/szk5043/1829522