1.Memcached是什么?
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在
已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。但随着数
据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大
影响。
这时就该 memcached 大显身手了。memcached 是高性能的分布式内存缓存服务器。一般的使用目的
是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展
性。
2.Memcached的特征
Memcached作为高速运行的分布式缓存服务器,具有一下的特点。
- 协议简单
- 基于lievent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
3.内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中,由于数据仅存在域内存中,因此重启memcached,重启操作系统会导致全部数据消失,另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不适用的缓存,memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久问性问题。
- 数据存储方式:Slab Allocation
- 数据过期方式:LRU,laxzy Expiration
memcached不互相通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,各个memcached不会互相通信以共享信息,那么怎么进行分布式呢?这完全取决于客户端的实现。
一:安装Memcached服务器
Memcached作为daemon后台启动时,只需
[root@Memcached1 /]# /usr/local/memcached/bin/memcached -p 11211 -m 64 -d
选项 | 说明 |
---|---|
-p | 使用的TCP端口,默认为11211 |
-m | 最大内存大小,默认为64M |
-v v | 用very vrebose模式启动,调用信息和错误输出到控制台 |
-d | 作为daemon在后台启动 |
-u | 指定以谁的身份运行 |
-x | 指定对端服务器,做双主模式的时候 |
上面时几个常用的启动选项,其他还有很多,可以通过来显示
[root@Memcached1 /] /usr/local/memcached/bin/memcached -h
名称 | IP地址 | 角色 | 主要软件包 |
---|---|---|---|
Memcached | 192.168.10.101 | Memcached服务器 | memcached-1.5.1.tar libevent-2.1.8-stable.tar |
Memcached | 192.168.10.102 | Memcached服务器 | memcached-1.5.1.tar libevent-2.1.8-stable.tar |
Memcached API | 192.168.10.201 | Memcached API 客户端 | memcached-2.2.0 libmemcached-1.0.18.tar |
1.安装Libevent
libevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问,Memcached的安装依赖于LIbevent,因此需要先完成Libevent的安装。
[root@Memcached1 src]# yum -y install gcc* make
[root@Memcached1 src]# tar zxvf libevent-2.1.8-stable.tar.gz
[root@Memcached1 src]# cd libevent-2.1.8-stable/
[root@Memcached1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent && make && make install
到处Libevent安装完毕,接下来就可以开始安装Memcached了。
2.安装Memcached
采用源码安装的方式进行Memcached的编译安装,安装时需要指定Libevent的安装路径
[root@Memcached1 src]# tar zxvf memcached-1.5.1.tar.gz
[root@Memcached1 src]# cd memcached-1.5.1/
[root@Memcached1 memcached-1.5.1]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent && make && make install
3.设置Memcached服务脚本
Memcached服务器安装完成后,可以使用安装目录下的bin/memcached来启动服务,但是为了更加方便管理Memcached,还是编写脚本来管理Memcached服务。
[root@Memcached1 memcached]# vim /usr/local/memcached/memcached
[root@Memcached1 memcached]# chmod +x memcached
[root@Memcached1 memcached]# netstat -antp | grep memcached
#!/bin/bash
CMD="/usr/local/memcached/bin/memcached"
start(){
$CMD -d -m 128 -u root
}
stop(){
killall memcached;
}
ACTION=$1
case $ACTION in
'start')
start;;
'stop')
stop;;
'restart')
stop
sleep 2
start;;
*)
echo 'Usage:{start|stop|restart}'
esac
两台Memcached都需要安装。
二:Memcached API客户端安装
为了使得程序可以直接调用Memcached库和接口,可以使用memcached扩展组件将Memcached添加为PHP的一个模块,此扩展使用了Libmemcached库提供的API与Memcached服务器进行交互。
1.编译安装Libmemcached
在编译Memcached扩展组件时,需要指定Libmemcached库的位置,所以先安装Libmemcached库
[root@LNMP src]# tar zxvf libmemcached-1.0.18.tar.gz
[root@LNMP libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached && make && make install
2.编译安装Memcached扩展
然后就可以进行PHP的Memcached扩展组件安装,注意配置Memcached API时,memcached-2.2.0.tgz源码包中默认没有configure配置脚本,需要使用PHP的phpize脚本生成配置脚本configure。
[root@LNMP src]# tar zxvf memcached-2.2.0.tgz
[root@LNMP memcached-2.2.0]# /usr/local/php5/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
如果这一步报错,需要安装:
[root@LNMP memcached-2.2.0]# yum -y install autoconf
[root@LNMP memcached-2.2.0]# /usr/local/php5/bin/phpize
[root@LNMP memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
[root@LNMP memcached-2.2.0]# make && make install
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/
-------------------------共享组件的位置
注意 配置时使用–disable-memcached-sasl选项关闭memcached的sasl认证功能,否则报错。
3.配置PHP添加Memcached组件
编辑PHP配置文件php.ini,添加Memcached组件。
[root@LNMP /]# cd /usr/local/php5/
[root@LNMP php5]# vim php.ini
-----------------添加一下内容------------------
825 extension_dir = “/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/” 找到Memcachde的目录
826 extension = memcached.so 开启模块
4.重启Apache服务。
[root@LNMP bin]# /usr/local/httpd/bin/apachectl restart
查看
5.测试Memcached API功能
通过编写简单的PHP测试代码调用Memcache程序接口,来测试是否与Memcacehd服务器协同工作。
<?php
$memcache = new Memcached();
$memcache->addServer('192.168.10.101', 11211);
$memcache->set('key', 'Memcache test successful!', 0, 60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
Memcached数据库操作和管理
Memcached协议简单,可直接使用telnet连接Memcached的11211端口,对memcached数据进行操作与管理。
[root@Memcached1 /]# telnet 192.168.10.101 11211 连接Memcached数据库
1.常见操作指令
①:添加一条键值数据
add username 0 0 8
zhangsan
STORED
其中 add username 0 0 8 表示键值名为username,标记位表示自定义信息为0,过期事件为0(永不过期,单位为秒),字节数为8,zhangsan为键值,注意输入长度为8字节,与设定值相符合。
②:查询键值数据
get username
VALUE username 0 8
zhangsan
END
gets username
VALUE username 0 8 3
zhangsan
END
其中get后跟键值名,如果检查最近是否更新,可以使用gets,最后一位显示的时更新因子,每更新一次更新因子数会加1
3.更新一条键值数据
set username 0 0 10
zhangsansb
STORED
get username
VALUE username 0 10
zhangsansb
END
其中set后跟需要更新的键值名,标记为,过期时间,字节数,如果键值名不存在,set相当于add,如果仅仅是想单纯的更新没有添加的功能,使用replace,此时更新的键值名必须存在,如果键值不存在,就会报NOT_STORED的错误。
replace username 0 0 12
zhangsansbsb
STORED
gets username
VALUE username 0 12 5
zhangsansbsb
END
replace username1 0 0 7
zhangsan
CLIENT_ERROR bad data chunk
ERROR
④:清除一条缓存数据
delete username
DELETED
get username
END
使用delete删除一条键值为username的缓存数据,使用get查看发现没有内容存在。
5.检查后更新
add username 0 0 4
lisi
STORED
gets username
VALUE username 0 4 6
lisi
END
cas username 0 0 4 1
lili
EXISTS
cas username 0 0 4 6
lili
STORED
gets username
VALUE username 0 4 7
lili
END
如果cas的最后一个更新因子数与gets返回的更新因子数相等,则更新,否则返回EXISTS
⑥:追加数据
get username
VALUE username 0 4
lili
END
append username 0 0 6
lisisb
STORED
get username
VALUE username 0 10
lililisisb
END
在键值名username的原键值后追加数据使用append
get username
VALUE username 0 10
lililisisb
END
prepend username 0 0 2
wo
STORED
get username
VALUE username 0 12
wolililisisb
END
在键值名username的原键值前追加数据使用prepend。
⑦:清除所有缓存数据
flush_all
OK
⑧:查看服务器统计信息
stats
stats itenm //返回所有键值对的统计信息
stats cachedump 1 0 //返回指定储存空间的键值对
stats slabs //显示各个slab信息,包括chunk的大小,数目,使用情况等
stats sizes //输出所有item的大小和个数
stats reset //清空统计的数据