Memcached安装使用说明

  categories:资料  author:

1. Memcached简介

 

1.1. 什么是Memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。

Memcached基于一个存储键/值对的HashMap,它并不提供冗余(复制其HashMap条目),当某个服务器停止运行或崩溃了,所有存放在服务器上的键/值对都将丢失。但目前Memcached的客户端和代理程序可以提供多服务器的并联方式,可以提供一定的处理能力。

1.2. Memcached与其他分布式缓存的区别

Memcached与其它常用的分布式缓存(例如EhCache、OSCache、JBoss Cache)最主要的区别在于Memcached采用集中式缓存方式(即一台或多台缓存服务器为所有应用系统提供缓存能力),自身不提供集群能力,不提供缓存复制功能;而其他分布式缓存系统采用分布式缓存方式,各个应用系统内部提供数据缓存的能力,多个缓存间采用组播或点对点的方式进行缓存同步。

在性能上来看,Memcached比其它分布式缓存系统低一半以上(未考虑大量数据在其它缓存系统进行复制的影响);但从管理方面来看,Memcached的缓存采用集中管理的模式,应用系统可以水平扩展,而其它分布式缓存在水平扩展的同时,必须同时调整缓存复制策略,一旦应用服务器节点大量扩展,对于缓存服务器间的数据复制将成几何数增加。

2. Memcached安装

本安装过程基于ubuntu 11.10进行,Windows用户直接从http://code.jellycan.com/memcached/上下载最新版本的可执行文件,可以直接跳过安装部分。

2.1. 下载Memcached的源码

从官网(http://www.memcached.org)上下载最新版本的Memcached源码,本文编写时,最新版本为memcached-1.4.13.tar.gz,下面说明均以此版本为例说明。

2.2. 下载依赖类库

Memcached编译需要libevent的支持,从官网(http://libevent.org/)下载最新版本。本文编写时,最新版本为libevent-2.0.17-stable.tar.gz。

Magent是memcached的代理程序,可以有效降低memcached单点故障导致程序异常的可能性,从官网(http://code.google.com/p/memagent/)下载最新版本。

备注:Moxi(http://labs.northscale.com/moxi/)是另一个memcached缓存的代理程序,因官网无法访问,没有进行测试。

2.3. 编译

1. 编译libevent

tar zxvf libevent-2.0.17-stable.tar.gz

cd libevent-2.0.17-stable/

./configure –prefix=/usr

make

sudo make install

#测试libevent是否安装成功

ls -al /usr/lib | grep libevent

2. 编译memcached

tar zxvf memcached-1.2.13.tar.gz

cd memcached-1.2.13/

./configure –with-libevent=/usr

make

sudo make install

cd ../

#测试memcached是否安装成功

ls -al /usr/local/bin | grep memcached

3. 编译magent

tar zxvf magent-0.5.tar.gz

sudo /sbin/ldconfig

sed -i “s#LIBS = -levent#LIBS = -levent -lm#g” Makefile

make

cp magent /usr/bin/magent

cd ../

在ubuntu下,make过程或报错,修改magent.c,加入以下内容即可。

#include <limits.h>

3. 简单示例

 

3.1. 启动memcached

memcached -m 1 -u root -d -l 127.0.0.1 -p 11211 -P /home/liumz/logs/1.log

memcached -m 1 -u root -d -l 127.0.0.1 -p 11212 -P /home/liumz/logs/2.log

memcached -m 1 -u root -d -l 127.0.0.1 -p 11213 -P /home/liumz/logs/3.log

分别在11211、11212、11213端口启动3个Memcached进程。

具体启动命令参数参见4.1. 启动命令

3.2. 启动magent

magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213

在12000端口开启magent代理程序,11211、11212端口为主Memcached,11213端口为备份Memcached。

连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11212和11213端口的Memcached。

当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出。

当11211、11212端口的Memcached重启复活,连接到12000端口,magent会从11211或11212端口的 Memcached取数据,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管11213端口的Memcached还有数 据。

3.3. Memcached基本操作实例

本实例以直连memcached进行,magent的操作与memcache的操作一致,但具体部分返回结果所有差别。详细操作见4.2 操作命令

# 连接memcached

telnet 127.0.0.1 11211

# 新增数据

set key1 0 0 3

abc

# 查询数据

get key1

# 服务器状态

stats

# 删除数据

delete key1

# 退出

quit

4. 附录

 

4.1. 启动命令

下表仅列出比较常用的参数,更多参数使用memcached –h进行查看。

参数

说明

-p <num>

TCP侦听端口号(默认不设置为: 11211)

-U <num>

UDP侦听端口 (默认: 11211, 0 时关闭)

-l <ip_addr>

绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)

-r

最大的核心文件数(maximize core file limit)

-d

独立进程运行

-u <username>

绑定使用指定用于运行进程 <username>

-m <num>

允许最大内存用量,单位M (默认: 64 MB)

-M

内存使用超出后,返回错误信息(而不是删除存储对象)

-c <num>

最大的请求数(默认:1024)

-h

显示帮助信息

-P <file>

将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用

文件名必须为全路径

在linux下

./usr/local/bin/memcached -d -u root -l 192.168.1.197 -m 2048 -p 12121

在window下

d:\ memcached\memcached.exe -d RunService -l 127.0.0.1 -p 11211 -m 500

在windows下注册为服务后运行:

sc.exe create memcached binpath= “d:\ memcached\memcached.exe -d RunService -p 11211 -m 500” start= auto

net start memcached

4.2. 操作命令

1. 写入数据

<command name> <key> <flags> <exptime> <bytes>\r <data block>\r

其中“\r”表示回车换行

n <command name> 可以是”set”, ”add”, ”replace”

“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。

“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。

“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。

n <key> 客户端需要保存数据的key

n  <flags> 是一个16位的无符号的整数(以十进制的方式表示)

该标志将和需要存储的数据一起存储,并在客户端get数据时返回。

客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。

n <exptime> 过期的时间

若为0表示存储的数据永远不过时(但可被服务器算法:LRU等替换)。

如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。

n <bytes> 需要存储的字节数(不包含最后的”\r”)

当用户希望存储空数据时,<bytes>可以为0,最后客户端需要加上”\r”作为”命令头”的结束标志。

n <data block>\r 数据内容

紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r”作为此次通讯的结束。

2. 获取数据

get <key>*\r

n <key>* 表示一个或者多个key(以空格分开)

n “\r” 命令头的结束

3. 删除数据

delete <key> <time>\r

n  <key> 需要被删除数据的key

n  <time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)

n “\r” 命令头的结束

4. 检查服务器状态

stats\r

可以看到memcache的获取次数,当前连接数,写入次数等;

指标

说明

pid

进程ID

uptime

服务器运行秒数

time

服务器当前unix时间戳

version

服务器版本

pointer_size

操作系统字大小

rusage_user

进程累计用户时间

rusage_system

进程累计系统时间

curr_connections

当前打开连接数

total_connections

曾打开的连接总数

connection_structures

服务器分配的连接结构数

cmd_get

执行get命令总数

cmd_set

执行set命令总数

cmd_flush

指向flush_all命令总数

get_hits

get命中次数

get_misses

get未命中次数

delete_misses

delete未命中次数

delete_hits

delete命中次数

incr_misses

incr未命中次数

incr_hits

incr命中次数

decr_misses

decr未命中次数

decr_hits

decr命中次数

cas_misses

cas未命中次数

cas_hits

cas命中次数

cas_badval

使用擦拭次数

auth_cmds

认证请求次数

auth_errors

认证错误次数

bytes_read

读取字节总数

bytes_written

写入字节总数

limit_maxbytes

分配的内存数(字节)

accepting_conns

目前接受的链接数

listen_disabled_num

threads

线程数

conn_yields

bytes

存储item字节数

curr_items

item个数

total_items

item总数

evictions

为获取空间删除item的总数

缓存命中率 = get_hits/cmd_get * 100%

5. 高级缓存细节查看

n 清空统计数据

stats reset

n 显示各个slab的信息

stats slabs

n 显示各个slab中item的信息

stats items

n 显示某个slab中的前limit_num个key列表

stats cachedump slab_id limit_num

显示格式如下

ITEM key_name [ value_length b; expire_time|access_time s]

其中,memcached 1.2.2及以前版本显示的是访问时间(timestamp),1.2.4(含)以上版本,显示过期时间(timestamp)。

如果是永不过期的key,expire_time会显示为服务器启动的时间

例如:

stats cachedump 1 10

ITEM key1 [250 b; 1207795754 s]

ITEM key2 [248 b; 1207793649 s]

n 设置或者显示详细操作记录

stats detail [on|off|dump]

参数为on,打开详细操作记录

参数为off,关闭详细操作记录

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

stats detail只对key中带前缀有效,即key必须为“xxx:yyy”,统计数据则为xxx的实际情况。

6. 清空所有键值

flush_all

注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。

7. 退出

quit\r



快乐成长 每天进步一点点