一、什么是memcached
Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
它是缓存服务器,但本身无法决定缓存任何数据,一半依赖于客户端,一半依赖于服务器,它自身只提供存储能力,但存储哪些数据,如何存是由客户端决定的。
二、memcached特点
memcached作为高速运行的分布式缓存服务器,具有以下的特点
简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
各服务器间彼此无视:不在服务器间进行数据同步;
O(1)的执行效率
清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;
补充:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
三、memcached存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
四、memcached安装与配置
系统环境
CentOS7.4
1 安装软件包
[root@proxy ~]#yum -y install memcached
查看生成的文件
[root@proxy ~]# rpm -ql memcached
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz
2 memcached配置文件
[root@proxy ~]# vim /usr/lib/systemd/system/memcached.service
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
[root@proxy ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
3、memcached常用选项说明
-l <ip_addr>:指定进程监听的地址;
-d: 以服务模式运行;
-u <username>:以指定的用户身份运行memcached进程;
-m <num>:用于缓存数据的最大内存空间,单位为MB,默认为64MB;
-c <num>:最大支持的并发连接数,默认为1024;
-p <num>: 指定监听的TCP端口,默认为11211;
-U <num>:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
-t <threads>:用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
-f <num>:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;
-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
-n: 指定最小的slab chunk大小;单位是字节;
-S: 启用sasl进行用户认证;
4、启动memcached服务
[root@proxy ~]# systemctl restart memcached
[root@proxy ~]# ss -antulp | grep memcached
udp UNCONN 0 0 *:11211 *:* users:(("memcached",pid=5736,fd=28))
udp UNCONN 0 0 :::11211 :::* users:(("memcached",pid=5736,fd=29))
tcp LISTEN 0 128 *:11211 *:* users:(("memcached",pid=5736,fd=26))
tcp LISTEN 0 128 :::11211 :::* users:(("memcached",pid=5736,fd=27))
5、memcached相关命令首先连接memcached
[root@proxy ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
查看状态统计信息
stats
STAT pid 5788
STAT uptime 25
STAT time 1453373921
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.011998
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 9
STAT bytes_written 7
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
使用telnet连接服务器测试memcached服务器功能,包括增、删、改、查等操作。
[root@proxy ~]# telnet localhost 11211
Trying ::1..
……
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
set name 0 180 3 //定义变量,变量名称为name
plj //输入变量的值,值为plj
STORED
get name //获取变量的值
VALUE name 0 3 //输出结果
plj
END
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
add myname 0 180 10 //新建,myname不存在则添加,存在则报错
set myname 0 180 10 //添加或替换变量
replace myname 0 180 10 //替换,如果myname不存在则报错
get myname //读取变量
append myname 0 180 10 //向变量中追加数据
delete myname //删除变量
stats //查看状态
flush_all //清空所有
quit //退出登录
6 部署LNMP+memcached网站平台,通过PHP页面实现对memcached服务器的数据操作
具体的LNMP环境部署过程在此就不在赘述了,前面篇章有介绍。
先查看每个服务运行状况:
[root@proxy ~]# ss -antulp | grep nginx
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=10557,fd=6),("nginx",pid=4746,fd=6))
[root@proxy ~]# ss -antulp | grep 9000
tcp LISTEN 0 128 127.0.0.1:9000 *:* users:(("php-fpm",pid=10689,fd=0),("php-fpm",pid=10688,fd=0),("php-fpm",pid=10687,fd=0),("php-fpm",pid=10686,fd=0),("php-fpm",pid=10685,fd=0),("php-fpm",pid=10683,fd=6))
[root@proxy ~]# ss -antulp | grep 3306
tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=5548,fd=14))
[root@proxy ~]# ss -antulp | grep 11211
udp UNCONN 0 0 *:11211 *:* users:(("memcached",pid=5736,fd=28))
udp UNCONN 0 0 :::11211 :::* users:(("memcached",pid=5736,fd=29))
tcp LISTEN 0 128 *:11211 *:* users:(("memcached",pid=5736,fd=26))
tcp LISTEN 0 128 :::11211 :::* users:(("memcached",pid=5736,fd=27))
创建PHP页面,使用PHP语言测试memcached服务
[root@proxy ~]# vim /usr/local/nginx/html/test.php
<?php
$memcache=new Memcache; //创建memcache对象
$memcache->connect('localhost',11211) or die ('could not connect!!');
$memcache->set('key','test'); //定义变量
$get_values=$memcache->get('key'); //获取变量值
echo $get_values;
?>
为PHP添加memcache扩展,需要给PHP安装扩展模块才可以连接memcached数据库
[root@proxy ~]# yum -y install php-pecl-memcache
[root@proxy ~]# systemctl restart php-fpm
客户端使用浏览器访问服务器PHP首页文档,检验对memcached的操作是否成功
[root@client ~]# firefox http://192.168.4.5/test.php
本文深入解析Memcached,一款高性能、分布式内存对象缓存系统,重点介绍其工作原理、特点、存储方式及在LNMP环境下的安装配置与PHP操作实践。
78

被折叠的 条评论
为什么被折叠?



