memcached服务器

  memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,提高动态web应用的速度和可扩展性。为了提高性能,memcached把数据存储在内存中,重启memcached或操作系统会导致全部数据消失,当内存容量达到指定值后,会使用LRU算法自动删除不使用的(或者很少使用的)缓存。memcached本身是为缓存设计的服务器,因此并没有过多考虑数据的持久化问题。

         技术分享

 
memcached服务器工作方式

   memcached使用多路复用IO模型以支持高并发访问。memcached会为每个item设置一个过期时间,但不是到期就把item从内存中删除,而是访问item时如果到了有效期,才把item从内存中删除,当memcached使用内存数大于设置的最大内存使用数时,为了腾出内存空间来存放新的数据,memcached会启用LRU算法淘汰旧的数据项memcached多线程模型:主线程接受客户端连接,并把连接分配给工作线程处理,有工作线程处理客户端连接的请求。

         技术分享

 


 

memcached服务器安装
 
1、首先安装依赖库libevent

1)官网http://libevent.org/ 下载最新源码,如:libevent-2.0.20-stable.tar.gz 

2)解压到/usr/src目录 ,执行命令:sudo tar -zxvf libevent-2.0.20-stable.tar.gz -C /usr/src

3)进入解压以后的目录,用sudo方式执行命令:sudo ./configure --prefix=/usr/local/libevent ; make ; make install

 
2、安装Memcached

1)下载

去官网 http://memcached.org/ 下最新源码,我用的是memcached-1.4.5.tar.gz

2)解压缩

#tar xzfv  memcached-1.4.5.tar.gz 

3)进入目录

#cd memcached-1.4.5 

4)编译,安装
./configure --prefix=/local/memcached
make
make install
安装完成后,会在 /local/memcached 出现bin和share目录
 
5)进入bin目录,启动memcache:
./memcached -d -u nobody -m 512 127.0.0.1 -p 11211
 
异常:error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
原因:找不到libevent-2.0.so.5类库
解决办法:
确定加载的类库路径:  #LD_DEBUG=libs ./memcached -v 2>&1 > /dev/null | less
出现(END)可以直接输入p退出  #ln -s /usr/local/lib/libevent-2.0.so.5 /lib/libevent-2.0.so.5

现在可以正常启动memcached了:#./memcached -d -u nobody -m 512 127.0.0.1 -p 11211        到这里,看到memcached已经启动,说明安装成功。

启动参数说明:
-d 选项是启动一个守护进程,
-m 是分配给 Memcache使用的内存数量,单位是 MB,这里是512MB
-u 是运行 Memcache的用户,这里是nobody
-l 是监听的服务器 IP地址,这里127.0.0.1 表示本机服务器
-p 是设置 Memcache监听的端口,这里设置了 11211,最好是1024 以上的端口
-c 选项是最大运行的并发连接数,默认是 1024,这里设置了256 ,按照你服务器的负载量来设定
-P 是设置保存 Memcache的pid 文件
-vv 开启调试信息和错误输出

 
memcached客户端安装
 
memcached客户端非常丰富,以php客户端memcache php扩展为例:

1)安装memcache PHP扩展

#wget http://pecl.php.net/get/memcache-2.2.4.tgz
#tar zxvf memcache-2.2.4.tgz
#cd memcache-2.2.4

2)找phpize

#whereis phpize 本机是/usr/bin/phpize
# /usr/bin/phpize
# ./configure --with-php-config=/usr/bin/php-config
# make
# make install

3)在/etc/php.ini文件添加一行:extension=memcache.so

4)重启httpd:#service httpd restart

5)确认:php里使用phpinfo()看到如下信息说明memcached扩展才算安装好!

 

相关操作

chkconfig --level 2345 memcached on #设置开机启动memcached服务

service memcached start #启动memcached服务

telnet localhost 11211 #用telnet连接到memcached服务器,即可执行memcached客户端命令

stats #当前memcached服务器的运行状态,重要指标:
cmd_get 查询缓存次数
cmd_set 设置key=>value的次数,没找到就写缓存
get_hits 总命中数
get_misses总未命中数

add 添加一个数据到服务器

set 替换一个已经存在的数据

get 获得数据的值

delete 删除数据

memcached-tool 127.0.0.1:11211 #使用memcached perl管理工具连接到memcached服务器

配置文件:/etc/sysconfig/memcached

 

PHP调用memcached示例

     php的memcache客户端应用程序扩展包含两组接口,一组是面向过程的接口,一组是面向对象的接口。PHP代码示例:

<?php

$memcache = new Memcache; //创建一个memcache对象

$memcache->connect(‘localhost‘, 11211) or die ("Could not connect" ); // 连接Memcached服务器

$memcache->set(‘key‘, ‘test‘); //设置一个变量到内存中,名称是key值是test

$get_value = $memcache ->get(‘key‘ ); // 从内存中取出key的值

echo $get_value;

?>

 


memcached服务器监控调优

1、MemAdmin:MemAdmin是一款可视化的Memcached管理控制台与监控工具,使用PHP开发,体积小,操作简单。主要功能包括服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新,服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控等

2、Twemperf(mcpery):一款memcached性能测试工具,可以模拟大并发set、get等操作。

使用实例:

     创建1000个并发连接;建立速度为每秒1000个,每一个连接发送set请求10次(相当于迭代10次),这10次请求以每秒1000的速度下发;设置连接和响应的超时时间为5s,设置tcp连接的断开时间(默认不开启),发送存储数据的大小(默认是1个字节),我们设为1个字节(也就是存入到memcached的value的大小)。 

     mcperf --num-conns=1000 --conn-rate=1000 --num-calls=10 --call-rate=1000 --timeout=5 --linger=0 --sizes=d1

结果字段说明:

     技术分享

3、memcached调优方法

1)存储的数据越大,则随着并发数的上升memcached处理请求的速度下降越明显,因此,存储数据不宜过大,如果确实要存储较大数据,建议拆分成两个或更多key来存储。

2)集群部署提升的性能越明显(平均耗时小,吞吐量大)

3)memcached中key最大允许250个英文字符或27个中文字,超过这些最大值,则数据无法存储。另外官方文档指出,value最大允许存储1M数据,超过1M的数据无法存储,因此建议key不宜过大,value也不宜过大,如果value超过1M,建议存储到两个或多个key中。

4)memcache内存存储满数据之后,之后再存储的数据不会再消耗内存,最老的数据会被删除(LRU算法),memcached启动参数默认是开启LRU(近期最少使用算法)的。如果启动参数加上-M则不开启LRU算法,此时如果内存已满再存放数据则会报错。

 


FAQ:

memcache与memcached的有什么区别?

      Memcache和Memcached是两个版本的扩展库,Memcache出现的较早,是一个原生版本,完全在php框架内开发的,支持的方法略微少点,而Memcached出现的较晚,比较先进,支持的方法多点,是建立在libmemcached的基础上。详见:http://www.cnblogs.com/wangtao_20/p/4057591.html

当使用多台memcached服务器时怎么确定一个数据应该保存到哪台服务器上?
      memcached分布式方案:普通hash分布、一致性hash分布。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。