天天看点

memcache的安装和操作使用

【背景】

memcached是一个开源的缓存服务,内存式的,数据以key/value值存在预先分配好的内存中。重启就丢失的。在内存中,所以存取速度快。 采用libevent事件模型。

memcached 是服务程序

memcache 是客户端程序 如作为php的模块

【应用场景】

1 mysql的缓存

2 session的缓存

【安装】

安装简单,易用

【安装步骤】

官网下载

http://memcached.org/  官网

<a href="http://www.memcached.org/files/memcached-1.4.29.tar.gz" target="_blank">http://www.memcached.org/files/memcached-1.4.29.tar.gz</a>

<code>tar</code> <code>-xvf  memcached-1.4.29.</code><code>tar</code><code>.gz </code>

<code>cd</code> <code>memcached-1.4.29</code>

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/memcached</code>

<code>make</code>

<code>make</code> <code>install</code>

可执行文件/usr/local/memcached/bin/memcached (可将其将加入环境变量)

如果不指定安装目录,默认安装在/usr/local 下面(则默认的可执行文件在/usr/local/bin/memcached)

【启动服务与停止服务】

查看帮助信息

/usr/local/memcached/bin/memcached -h

查看版本信息

/usr/local/memcached/bin/memcached -V

常用的启动参数:

-p &lt;num&gt;      TCP port number to listen on (default: 11211)

-u &lt;username&gt; assume identity of &lt;username&gt; (only when run as root)

-l &lt;addr&gt;     interface to listen on (default: INADDR_ANY, all addresses)

-d            run as a daemon

-m &lt;num&gt;      max memory to use for items in megabytes (default: 64 MB)

-P &lt;file&gt;     save PID in &lt;file&gt;, only used with -d option

-t &lt;num&gt;      number of threads to use (default: 4)

-c &lt;num&gt;      max simultaneous connections (default: 1024)

-M            return error on memory exhausted (rather than removing items)

启动2个实例:

<code>/usr/local/memcached/bin/memcached</code>  <code>-p 11211 -u root -c 1024 -m 16m -d -P </code><code>/var/run/memcached_11211</code><code>.pid</code>

<code>/usr/local/memcached/bin/memcached</code>  <code>-p 11212 -u root -c 1024 -m 16m -d -P </code><code>/var/run/memcached_11212</code><code>.pid</code>

验证:

<code>ps</code> <code>-ef |</code><code>grep</code> <code>memcached</code>

<code>netstat</code> <code>-tulnp |</code><code>grep</code> <code>mem</code>

带日志并后台启动:

<code>memcached -p 11211 -uroot -c 1024 -m 16m -P </code><code>/var/runmemcached_11212</code><code>.pid -vv &amp;&gt; </code><code>/var/log/memcached_11211</code><code>.log &amp;</code>

停止memcached

1 可以强制全部杀死

<code>pkill memcached</code>

2 强制杀死一个

<code>kill</code> <code>-9 pid</code>

3 正规路径停止memcached

<code>kill</code> <code>`</code><code>cat</code> <code>/var/run/memcached_11211</code><code>.pid`</code>

【linux命令下简单操作memcached】

注意: 一般不常用,只为调试和学习用。

方式1 telnet

方式2 printf或结合nc命令  --- 推荐使用

设定一个key

printf "set key1 0 0 5\r\n12345\r\n"|nc 127.0.0.1 11211

获取一个key

printf "get key1\r\n"|nc 127.0.0.1 11211 

echo stats | nc localhost  11211

echo stats items | nc 127.0.0.1 11211

实时查看状态

watch -n1 -d  "echo stats | nc localhost  11211"

查看设置

printf  "stats settings\r\n" | nc 127.0.0.1 11212

查看slabs

printf  "stats slabs\r\n" | nc 127.0.0.1 11212     

【lamp 与lnmp中安装memcache模块的环境】

确保环境已经安装好 lnmp

查看php的配置信息

/usr/local/php/bin/php -i |grep configure

可以确定是lnmp还是php-fpm环境

或者通过

ls /usr/local/php 目录下是否有sbin目录,有则是lnmp环境,使用了sbin/php-fpm方式启动php

查看此时是否已经安装了memcache模块

[root@slave html]# cat phpinfo.php 

&lt;?php

phpinfo();

?&gt;

或者

/usr/local/php/bin/php -m

且此时不能看到memcache模块

【为lnmp的php安装memcache模块】

下载php的memcache模块

<a href="http://pecl.php.net/package/memcache" target="_blank">http://pecl.php.net/package/memcache</a>

<code>tar</code> <code>zxvf memcache-2.2.7.tgz</code>

<code>cd</code> <code>memcache-2.2.7</code>

<code>/usr/local/php/bin/phpize</code>

<code>.</code><code>/configure</code> <code>--with-php-config=</code><code>/usr/local/php/bin/php-config</code> 

<code>make</code> 

结果:

[root@slave memcache-2.2.7]# make install

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

【memcache在php中生效-修改php.ini配置文件】

extension_dir = "./"

修改为

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626"

并添加一行

extension = memcache.so

重启php-fpm

killall php-fpm

启动

/usr/local/php/sbin/php-fpm

或者知指定配置文件进行启动。

/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini  -y /usr/local/php/etc/php-fpm.conf

-c &lt;path&gt;|&lt;file&gt; Look for php.ini file in this directory

-y, --fpm-config &lt;file&gt;

推荐使用(安全重启的方法)

<code>默认php-fpm.conf是没有的需要自己创建,里面就是配置是管理php-fpm进程的。需要自己创建(且pid默认是none的,需要打开pid那行的配置文件,启用pid文件)</code>

<code>#/usr/local/php/bin/php -m |grep mem</code>

<code>memcache</code>

且phpinfo页面可以看到memcache模块的详细信息

【一段小程序php连接memcache】

连接数据库只需要指定IP:port就可以了。

[root@slave html]# cat  test_conn_memcache.php

<code>&lt;?php  </code>

<code>//连接Memcache  </code>

<code>$mem</code> <code>= </code><code>new</code> <code>Memcache;  </code>

<code>$mem</code><code>-&gt;addServer(</code><code>"192.168.100.10"</code><code>, 11211);  </code>

<code>//保存数据  </code>

<code>$mem</code><code>-&gt;set(</code><code>'key1'</code><code>, </code><code>'This is first value'</code><code>, 0, 60);  </code>

<code>$val</code> <code>= </code><code>$mem</code><code>-&gt;get(</code><code>'key1'</code><code>);  </code>

<code>echo</code> <code>"Get key1 value: "</code> <code>. </code><code>$val</code> <code>.</code><code>"&lt;br&gt;"</code><code>;  </code>

<code>//保存数组数据  </code>

<code>$arr</code> <code>= </code><code>array</code><code>(</code><code>'aaa'</code><code>, </code><code>'bbb'</code><code>, </code><code>'ccc'</code><code>, </code><code>'ddd'</code><code>);  </code>

<code>$mem</code><code>-&gt;set(</code><code>'key2'</code><code>, </code><code>$arr</code><code>, 0, 60);  </code>

<code>$val2</code> <code>= </code><code>$mem</code><code>-&gt;get(</code><code>'key2'</code><code>);  </code>

<code>echo</code> <code>"Get key2 value: "</code><code>;  </code>

<code>print_r(</code><code>$val2</code><code>);  </code>

<code>echo</code> <code>"&lt;br&gt;"</code><code>;  </code>

<code>//删除数据  </code>

<code>$mem</code><code>-&gt;</code><code>delete</code><code>(</code><code>'key1'</code><code>);  </code>

<code>echo</code> <code>"After delete key1 ,Get key1 value: "</code> <code>. </code><code>$val</code> <code>. </code><code>"&lt;br&gt;"</code><code>;  </code>

<code>//关闭连接  </code>

<code>$mem</code><code>-&gt;close();  </code>

<code>?&gt;</code>

或如下简单的程序

<code>&lt;?php</code>

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

<code>$memcache</code><code>-&gt;connect(</code><code>'localhost'</code><code>, 11211) </code><code>or</code> <code>die</code> <code>(</code><code>"Could not connect"</code><code>); </code><code>//连接Memcached服务器$memcache-&gt;</code>

<code>set(</code><code>'key'</code><code>, </code><code>'test'</code><code>);        </code><code>//设置一个变量到内存中,名称是key 值是test</code>

<code>$get_value</code> <code>= </code><code>$memcache</code><code>-&gt;get(</code><code>'key'</code><code>);  </code><code>//从内存中取出key的值</code>

<code>echo</code> <code>$get_value</code><code>;?&gt;</code>

<a href="http://s1.51cto.com/wyfs02/M02/85/85/wKioL1enJW3z0IkOAABJv6ivvnE798.jpg" target="_blank"></a>

注意: php-fpm的日志路径/usr/local/php/var/log/php-fpm.log

【监控memcached的使用状态】

1 结合zabbix和shell

内存大小

命中率

2 使用开源的图形软件memadmin

<a href="http://www.junopen.com/memadmin" target="_blank">http://www.junopen.com/memadmin</a>

安装(lnmp 或者 lamp环境可运行)

tar xvf memadmin-1.0.12.tar.gz -C /usr/local/nginx/html/

(可能要稍稍配置一下nginx.conf文件内容)

连接

http://192.168.100.13/memadmin/index.php?action=set.con

大致所的stats信息:

参数值描述

pid2773memcache服务器进程ID

uptime13263服务器已运行秒数

time1470577520服务器当前Unix时间戳

version1.4.13memcache版本

libevent1.4.13-stablelibevent版本

pointer_size64操作系统指针大小

rusage_user0.321951进程累计用户时间

rusage_system0.446932进程累计系统时间

curr_connections10当前连接数量

total_connections58Memcached运行以来连接总数

connection_structures12Memcached分配的连接结构数量

reserved_fds20内部使用的FD数

cmd_get   44get命令请求次数

cmd_set     26set命令请求次数

cmd_flush0flush命令请求次数

cmd_touch0touch命令请求次数

get_hits25get命令命中次数

get_misses19get命令未命中次数

delete_misses0delete命令未命中次数

delete_hits12delete命令命中次数

incr_misses0incr命令未命中次数

incr_hits0incr命令命中次数

decr_misses0decr命令未命中次数

decr_hits0decr命令命中次数

cas_misses0cas命令未命中次数

cas_hits0cas命令命中次数

cas_badval0使用擦拭次数

touch_hits0touch命令命中次数

touch_misses0touch命令未命中次数

auth_cmds0认证命令处理的次数

auth_errors0认证失败数目

bytes_read3121读取总字节数

bytes_written23943发送总字节数

limit_maxbytes16777216分配的内存总大小(字节)

accepting_conns1接受新的连接

listen_disabled_num0失效的监听数

threads     4当前线程数

conn_yields0连接操作主动放弃数目

hash_power_level16hash表等级

hash_bytes524288当前hash表大小

hash_is_expanding0hash表正在扩展

expired_unfetched0已过期但未获取的对象数目

evicted_unfetched0已驱逐但未获取的对象数目

bytes132当前存储占用的字节数

curr_items1当前存储的数据总数

total_items24启动以来存储的数据总数

evictions0LRU释放的对象数目

reclaimed1已过期的数据条目来存储新数据的数目

区别:

curr_items              Memcached 当前存储的内容数量    

total_items             Memcached 启动以来存储过的内容总数    

【memcached的集群】

因为mencache的各各节点是独立的,数据不共享,所以需要通过程序调度算法进行memcached分布式的使用.

如:memcache代理程序进行url hash算法 决定到某个node

【用作lamp的session缓存--针对小站点】

vim  /usr/local/php/etc/php.ini

修改两项就可以

 session.save_handler = files

改成

 session.save_handler = memcache

;session.save_path = "/tmp"

改成呢个

session.save_path = "tcp://ip:port"

【运维管理memcache常用的命令】

1 测试增加键值并赋值

set命令 

语法: 

command &lt;key&gt; &lt;flags&gt; &lt;expiration time&gt; &lt;bytes&gt;

&lt;value&gt;

参数说明如下:

command set/add/replace

key     key 用于查找缓存值

flags     可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息

expiration time     在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)

bytes     在缓存中存储的字节点

value     存储的值(始终位于第二行)

set userid 0 0 5   --&gt;执行

12345  —&gt;第二行设置内容value

STORED --&gt;返回

2 获取value  

get mykey mykey1  获取多个key的值  

get userid   --&gt;执行获取userid的值

VALUE userid 0 5  --&gt;userid的信息

12345  --&gt;userid的值

END  ---&gt;返回值

# echo -e  "get a" | nc 127.0.0.1 11211

VALUE a 0 5

22222

END

# echo -e  "set a 0 0 5\r\n22222\r\n" | nc 127.0.0.1 11211

STORED

ERROR    ---&gt; echo命令的结束自带\n 导致。

最好是使用printf进行输出。因为printf和echo是有区别的,因为prinf是不自带换行符的,而且memcache中的换行符只是支持 \r\n.所以使用echo 会自带的\n在内部会产生一个ERROR的错误。

[root@ops-cuizhiliang001 ~]# printf  "set a 0 0 5\r\n33333\r\n" | nc 127.0.0.1 11211

3 add 区别set

仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

下面是使用 add 命令的标准交互:

set userid 0 0 5

get userid    

VALUE userid 0 5

add userid 0 0 5   ---&gt;执行 

11111   ---&gt; value

NOT_STORED  ---&gt;返回值,

get userid

VALUE userid 0 5 

22222   ---&gt;因为执行add的时候userid是存在的,所有值不变,为原来的值。

4 flush_all

刷新掉所有keys的值,清空。注意是清空缓存的值,key是不删除的。将当前所有缓存数据设置为过期,但不会释放内存

5 delete 删除执行的key

VALUE userid 0 4

1234

delete userid   --&gt;执行删除操作

DELETED   ---&gt;返回值

6 stats 查看信息

printf "stats\r\n" |nc 127.0.0.1 11211

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1835401如需转载请自行联系原作者

cuizhiliang

下一篇: awk