Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对数据库的访问来加速web应用程序。它是一个基于内存的“键值对”存储 ,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
一、 memcached既不是一个代码加速器,也不是数据库中间件。其具有以下 特点 :
⑴内置内存存储方式 :为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。重启memcached,重启操作系统会导致全部数据消失;
⑵简单key/value 存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
⑶O(1)的执行效率;
⑷基于libevent的事件处理:libevent是个函数库,它将Linux的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,能发挥高性能;
⑸功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并设置数据项的过期时长;
⑹各服务器间不会通信以共享信息 ;memcached虽然是分布式缓存服务器,但服务器端并没有分布式功能,此功能主要通过客户端实现;
⑺清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户端所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长,发现过期才清理;
二、memcached的内存管理
可参考http://blog.csdn.net/dato/article/details/1968663
三、安装memcached
1、memcached依赖于libevent 实现并发处理,先要安装后libevent包,不过此包是系统标配;
yum -y install memcached
2、启动memcached服务
service memcached start #memcached默认监听在TCP和UDP的11211 号端口
[root@node4 ~]# rpm -q libevent
libevent-1.4.13-4.el6.x86_64
[root@node4 ~]# yum -y install memcached
...
[root@node4 ~]# rpm -ql memcached
/etc/rc.d/init.d/memcached
/etc/sysconfig/memcached #主配置文件
/usr/bin/memcached #主程序
/usr/bin/memcached-tool
/usr/share/doc/memcached-1.4.4
...
[root@node4 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024" #并发连接数
CACHESIZE="64" #用于缓存的空间大小
OPTIONS=""
[root@node4 ~]# service memcached start
...
[root@node4 ~]# ss -tunl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 :::11211 :::*
tcp LISTEN 0 128 :::11211 :::*
tcp LISTEN 0 128 *:11211 *:*
... 3、memcached主程序常用选项
-l :指定进程监听的地址
-d : 以守护进程模式运行;
-u :以指定的用户身份运行memcached进程;
-m :用于缓存数据的最大内存空间,单位为MB,默认为64MB;
-c :最大支持的并发连接数,默认为1024;
-p : 指定监听的TCP端口,默认为11211;
-P : pid文件
-U :指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
-t :用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
-f :设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;默认为1.25
-M :当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
-n: 指定最小的slab chunk大小;单位是字节;
-S: 启用sasl进行用户认证;
[root@node4 ~]# memcached -u memcached -vv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
slab class 5: chunk size 240 perslab 4369
slab class 6: chunk size 304 perslab 3449
slab class 7: chunk size 384 perslab 2730
slab class 8: chunk size 480 perslab 2184
slab class 9: chunk size 600 perslab 1747
slab class 10: chunk size 752 perslab 1394
...
[root@node4 ~]# memcached-tool 127.0.0.1
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
1 96B 80717s 1 1 no 0 0 0
[root@node4 ~]# memcached-tool 127.0.0.1 stats
#127.0.0.1:11211 Field Value
...
pointer_size 64
rusage_system 1.216815
rusage_user 1.241811
threads 4
time 1463497553
total_connections 17
total_items 7
uptime 81292
version 1.4.4
四、Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。
1、存储类命令:set, add, replace, append, prepend
用法:
例如:set user 0 0 8 #过期时长为0表示永不过期
jerry
set :无论如何都存储,数据不存在时存储,数据存在时更新
add :数据不存在时进行添加
replace:替换
append:将数据追加到当前缓存数据的之后
prepend:将数据追加到当前缓存数据的之前
2、获取数据类命令:get, delete, incr/decr
get key1 key2...:读取
incr/decr key:对数字型的对象进行增/减操作
3、统计类命令:
stats :查看memcached运行状态
stats items:
stats slabs:显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats sizes:输出所有item的大小和个数
4、清理命令:
delete key:删除
flush_all:将当前所有缓存数据设置为过期,但不会释放内存
[root@node4 ~]# telnet 127.0.0.1 11211 #使用telnet命令测试memcached的使用
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set user 0 60 5
jerry
STORED
add gender 0 60 6
female
STORED
get user
VALUE user 0 5
jerry
END
delete gender
DELETED
stats
STAT pid 37622
STAT uptime 80761
STAT time 1463497022
STAT version 1.4.4
STAT pointer_size 64
STAT rusage_user 1.241811
STAT rusage_system 1.173821
STAT curr_connections 10
STAT total_connections 15
STAT connection_structures 11
...
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 74
STAT curr_items 1
STAT total_items 7
STAT evictions 0
END
五、PHP作为memcached的客户端
1、在php-fpm服务器上安装PHP的memcache扩展
# wget https://pecl.php.net/get/memcache-2.2.7.tgz
# tar xf memcache-2.2.7.tgz
# cd memcache-2.2.7
# /usr/local/php/bin/phpize 生成configure文件
# ./configure --with-php-config =/usr/local/php/bin/php-config --enable-memcache
# make && make install
安装完后会有类似以下的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20130626/
2、编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加memcache扩展的路径:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20130626/memcache.so
◆补充:rpm方式安装的php-fpm如何加载扩展模块
此种情况需要先安装php-devel包,该包能提供phpize和php-config两个二进制程序。其余步骤与上述类似,根据实际情况做适当修改即可。
# yum -y install php-devel
......
# ./configure --with-php-config=/usr/bin/php-config --enable-memcache
...
cp tmp-php.ini /etc/php.d/
vim /etc/php.d/tmp-php.ini
extension=/usr/lib64/php/modules/memcache.so
示例:
#此例中的php-fpm是使用rpm方式安装的,所以若欲对其做扩展就要先安装php-devel
[root@node1 ~]# yum -y install php-devel
...
[root@node1 ~]# rpm -ql php-devel
/etc/rpm/macros.php
/usr/bin/php-config
/usr/bin/phpize
/usr/include/php
...
[root@node1 ~]# wget https://pecl.php.net/get/memcache-2.2.7.tgz #下载memcache扩展源码包
...
[root@node1 ~]# tar xf memcache-2.2.7.tgz
[root@node1 ~]# cd memcache-2.2.7
[root@node1 memcache-2.2.7]# phpize #生成configure文件
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@node1 memcache-2.2.7]# ls
acinclude.m4 config9.m4 config.sub CREDITS Makefile.global memcache.php memcache_standard_hash.c README
aclocal.m4 config.guess configure example.php memcache.c memcache_queue.c missing run-tests.php
autom4te.cache config.h.in configure.in install-sh memcache_consistent_hash.c memcache_queue.h mkinstalldirs
build config.m4 config.w32 ltmain.sh memcache.dsp memcache_session.c php_memcache.h
[root@node1 memcache-2.2.7]# ./configure --with-php-config=/usr/bin/php-config --enable-memcache #编译
...
[root@node1 memcache-2.2.7]# make && make install
...
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/lib64/php/modules/ #memcache模块的目录
[root@node1 memcache-2.2.7]# ls /usr/lib64/php/modules/
curl.so fileinfo.so json.so memcache.so phar.so zip.so
[root@node1 memcache-2.2.7]# cp tmp-php.ini /etc/php.d/
[root@node1 memcache-2.2.7]# vim /etc/php.d/tmp-php.ini
在Dynamic Extensions段下添加:
extension=/usr/lib64/php/modules/memcache.so
[root@node1 memcache-2.2.7]# service php-fpm restart
...
3、对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com