现在的位置: 首页 > 综合 > 正文

memcached使用小结

2013年12月10日 ⁄ 综合 ⁄ 共 3252字 ⁄ 字号 评论关闭
1. 安装 memcached,还是那套 ./configure; make; make install,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent。

2. 安装 pecl::memcache,用 pecl 命令行工具安装:

pecl install memcache

或直接从源码安装:

phpize
 ./configure
 make
 make install

将 php.ini 中 extension=memcache.so 打开,重启一下 apache,查看 phpinfo 中的 "Registered save handlers" 会有 "files user memcache" 这3个可用。

3. 修改配置文件,在 php.ini 中全局设置:

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

或者某个目录下的 .htaccess :

php_value session.save_handler "memcache"
php_value session.save_path  "tcp://127.0.0.1:11211"

再或者在某个一个应用中:

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");


果要做分布式的memcache,就要把127.0.0.1改成局域网内的IP地址。使用多个 memcached server
时用逗号","隔开,并且和 Memcache::addServer()
文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval"
等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"

4. 启动 memcached:

#memcached -d -l 127.0.0.1 -p 11212 -m 128
/usr/local/bin/memcached -d -m 50 -u root -l 192.168.1.13 -p 11211 -P /tmp/memcached
-m memcache最大可用内存数(单位:M)
-u 用户
-l 链接地址,如果是多个机器共用memcache,一定要使用局域网IP
-p 端口号
-P ...

5. 在程序中使用 memcache 来作 session 存储,用例子测试一下:

<?php
session_start();
if (!isset($_SESSION['TEST'])) {
    $_SESSION['TEST'] = time();
}
 
$_SESSION['TEST3'] = time();
 
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>

6. 用 sessionid 去 memcached 里查询一下:

<?php
$memcache = memcache_connect('localhost', 11211);
var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077'));
?>

会有看到

string(37) "TEST|i:1177556731;TEST3|i:1177556881;"

这样的输出,证明 session 正常工作。


memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session
时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在
memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。

命令行查看Memcached运行状态

很多时候需要监控服务器上的Memcached运行情况,比如缓存的查询次数,命中率之类的。但找到的
那个memcached-tool是linux下用perl写的,我也没试过windows能不能用。后来发现个简单的办法
可以做到,就是使用Telnet。
首先登录到服务器,然后在cmd命令行中键入
telnet 127.0.0.1 11211
其中127.0.0.1是服务器的地址(这里是本机) ,11211是memcached绑定的端口号。
之后命令行窗口全黑只有光标提示,摸黑输入stats,即可得到描述Memcached服务器运行情况的参
数。如下图:
 
其中,uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。这两个数据相除一下就能得到
平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压
力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。
下面的cmd_set 就是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内
容,就会调用一下cmd_set写进缓存里。紧跟着是get_hits,就是缓存命中的次数。缓存命中率 =
get_hits/cmd_get * 100%。
下面的get_misses的数字加上get_hits应该等于cmd_get。而total_itemscurr_items表示现在在缓
存中的键值对个数,在图上total_items == cmd_set == get_misses,不过当可用最大内存用光时
,memcached就会删掉一些内容,上面的等式就不成立了。
话说回来,memcached要是能有一套完整的监测工具就太好了。memcached的安装和php相应配置请看
这里。


Memcached的stats命令

 telnet到memcached服务器后有很多的命令可以使用,除了大家熟知的add、get、set、incr、decr、replace、delete等赋值命令外,还有一系列的获取服务器信息的命令,这部分命令都是以stats开头的。
用PHP的Memcache::getStats($cmd)也可以访问这些命令

常用的命令

stats
显示服务器信息、统计数据等

stats reset
清空统计数据

stats malloc
显示内存分配数据

stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,显示格式如下
ITEM key_name [ value_length b; expire_time|access_time s]
其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)
1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)
如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2
ITEM copy_test1 [250 b; 1207795754 s]
ITEM copy_test [248 b; 1207793649 s]

stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等

stats items
显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

stats detail [on|off|dump]
设置或者显示详细操作记录

参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

stats detail dump
PREFIX copy_test2 get 1 hit 1 set 0 del 0
PREFIX copy_test1 get 1 hit 1 set 0 del 0
PREFIX cpy get 1 hit 0 set 0 del 0

抱歉!评论已关闭.