Memcached 支持许多平台:Linux、FreeBSD、Solaris、Mac OS,也可以安装在Windows上。

Linux系统安装memcached,首先要先安装libevent库。

sudo apt-get install libevent libevent-deve          自动下载安装(Ubuntu/Debianyum install libevent libevent-deve                      自动下载安装(Redhat/Fedora/Centos

安装 Memcached

自动安装

Ubuntu/Debian

sudo apt-get install memcached

Redhat/Fedora/Centos

yum install memcached

FreeBSD

portmaster databases/memcached

源代码安装

从其官方网站(http://memcached.org)下载memcached最新版本。

wget http://memcached.org/latest                    下载最新版本tar -zxvf memcached-1.x.x.tar.gz                    解压源码cd memcached-1.x.x                                  进入目录./configure --prefix=/usr/local/memcached           配置make && make test                                   编译sudo make install                                   安装

Memcached 运行

Memcached命令的运行:

$ /usr/local/memcached/bin/memcached -h                           命令帮助

注意:如果使用自动安装 memcached 命令位于 /usr/local/bin/memcached

启动选项:

  • -d是启动一个守护进程;
  • -m是分配给Memcache使用的内存数量,单位是MB;
  • -u是运行Memcache的用户;
  • -l是监听的服务器IP地址,可以有多个地址;
  • -p是设置Memcache监听的端口,,最好是1024以上的端口;
  • -c是最大运行的并发连接数,默认是1024;
  • -P是设置保存Memcache的pid文件。

(1)作为前台程序运行:

从终端输入以下命令,启动memcached:

/usr/local/memcached/bin/memcached -p 11211 -m 64m -vvslab class   1: chunk size     88 perslab 11915slab class   2: chunk size    112 perslab  9362slab class   3: chunk size    144 perslab  7281中间省略slab class  38: chunk size 391224 perslab     2slab class  39: chunk size 489032 perslab     2<23 server listening<24 send buffer was 110592, now 268435456<24 server listening (udp)<24 server listening (udp)<24 server listening (udp)<24 server listening (udp)

这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211,最大内存使用量为64M。调试信息的内容大部分是关于存储的信息。

(2)作为后台服务程序运行:

# /usr/local/memcached/bin/memcached -p 11211 -m 64m -d

或者

/usr/local/memcached/bin/memcached -d -m 64M -u root -l 192.168.0.200 -p 11211 -c 256 -P /tmp/memcached.pid

我们可以通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

语法

telnet HOST PORT

命令中的 HOSTPORT 为运行 Memcached 服务的 IP 和 端口。

实例

以下实例演示了如何连接到 Memcached 服务并执行简单的 set 和 get 命令。

本实例的 Memcached 服务运行的主机为 127.0.0.1(本机) 、端口为 11211。

telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set foo 0 0 3                                                   保存命令bar                                                             数据STORED                                                          结果get foo                                                         取得命令VALUE foo 0 3                                                   数据bar                                                             数据END                                                             结束行quit                                                            退出

Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

语法:

set 命令的基本语法格式如下:

set key flags exptime bytes [noreply] value 

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → 51coolma
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 9 (数据存储的字节数)
  • value → memcached
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedEND

输出

如果数据设置成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • ERROR:在保持失败后输出。

Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

语法:

add 命令的基本语法格式如下:

add key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → new_key
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 10 (数据存储的字节数)
  • value → data_value
add new_key 0 900 10data_valueSTOREDget new_keyVALUE new_key 0 10data_valueEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED :在保持失败后输出。

Memcached replace 命令用于替换已存在的 key(键)value(数据值)

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

语法:

replace 命令的基本语法格式如下:

replace key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → mykey
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 10 (数据存储的字节数)
  • value → data_value

以下实例中我们使用的键位 'mykey' 并存储对应的值 data_value。执行后我们替换相同的 key 的值为 'some_other_value'。

add mykey 0 900 10data_valueSTOREDget mykeyVALUE mykey 0 10data_valueENDreplace mykey 0 900 16some_other_valueget mykeyVALUE mykey 0 16some_other_valueEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:执行替换失败后输出。

Memcached append 命令用于向已存在 key(键)value(数据值) 后面追加数据 。

语法:

append 命令的基本语法格式如下:

append key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

实例如下:

  • 首先我们在 Memcached 中存储一个键 51coolma,其值为 memcached。
  • 然后,我们使用 get 命令检索该值。
  • 然后,我们使用 append 命令在键为 51coolma 的值后面追加 "redis"。
  • 最后,我们再使用 get 命令检索该值。
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 14memcachedENDappend 51coolma 0 900 5redisSTOREDget 51coolmaVALUE 51coolma 0 14memcachedredisEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:该键在 Memcached 上不存在。
  • CLIENT_ERROR:执行错误。

Memcached prepend 命令用于向已存在 key(键)value(数据值) 前面追加数据 。

语法:

prepend 命令的基本语法格式如下:

prepend key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

实例如下:

  • 首先我们在 Memcached 中存储一个键 51coolma,其值为 memcached。
  • 然后,我们使用 get 命令检索该值。
  • 然后,我们使用 prepend 命令在键为 51coolma 的值后面追加 "redis"。
  • 最后,我们再使用 get 命令检索该值。
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 14memcachedENDprepend 51coolma 0 900 5redisSTOREDget 51coolmaVALUE 51coolma 0 14redismemcachedEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:该键在 Memcached 上不存在。
  • CLIENT_ERROR:执行错误。

Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作

它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

语法:

CAS 命令的基本语法格式如下:

cas key flags exptime bytes unique_cas_token [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • unique_cas_token通过 gets 命令获取的一个唯一的64位值。
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

要在 Memcached 上使用 CAS 命令,你需要从 Memcached 服务商通过 gets 命令获取令牌(token)。

gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的 "版本" 标识符。

实例步骤如下:

  • 如果没有设置唯一令牌,则 CAS 命令执行错误。
  • 如果键 key 不存在,执行失败。
  • 添加键值对。
  • 通过 gets 命令获取唯一令牌。
  • 使用 cas 命令更新数据
  • 使用 get 命令查看数据是否更新
cas tp 0 900 9ERROR             <− 缺少 tokencas tp 0 900 9 2memcachedNOT_FOUND         <−  tp 不存在set tp 0 900 9memcachedSTOREDgets tpVALUE tp 0 9 1memcachedENDcas tp 0 900 5 1redisSTOREDget tpVALUE tp 0 5redisEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • ERROR:保存出错或语法错误。
  • EXISTS:在最后一次取值后另外一个用户也在更新该数据。
  • NOT_FOUND:Memcached 服务上不存在该键值。

Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

语法:

get 命令的基本语法格式如下:

get key

多个 key 使用空格隔开,如下:

get key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedEND

Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。

语法:

gets 命令的基本语法格式如下:

gets key

多个 key 使用空格隔开,如下:

gets key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。

set 51coolma 0 900 9memcachedSTOREDgets 51coolmaVALUE 51coolma 0 9 1memcachedEND

在 使用 gets 命令的输出结果中,在最后一列的数字 1 代表了 key 为 51coolma 的 CAS 令牌。

Memcached delete 命令用于删除已存在的 key(键)。

语法:

delete 命令的基本语法格式如下:

delete key [noreply]

多个 key 使用空格隔开,如下:

delete key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • noreply(可选): 该参数告知服务器不需要返回数据

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。之后我们使用 delete 命令删除该 key。

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedENDdelete 51coolmaDELETEDget 51coolmaENDdelete 51coolmaNOT_FOUND

输出

输出信息说明:

  • DELETED:删除成功。
  • ERROR:语法错误或删除失败。
  • NOT_FOUND:key 不存在。

Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR


incr 命令

语法:

incr 命令的基本语法格式如下:

incr key increment_value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • increment_value: 增加的数值。

实例

在以下实例中,我们使用 visitors 作为 key,初始值为 10,之后进行加 5 操作。

set visitors 0 900 210STOREDget visitorsVALUE visitors 0 210ENDincr visitors 515get visitorsVALUE visitors 0 215END

输出

输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。

decr 命令

decr 命令的基本语法格式如下:

decr key decrement_value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • decrement_value: 减少的数值。

实例

set visitors 0 900 210STOREDget visitorsVALUE visitors 0 210ENDdecr visitors 55get visitorsVALUE visitors 0 15END

在以下实例中,我们使用 visitors 作为 key,初始值为 10,之后进行减 5 操作。

输出

输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。

Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

语法:

stats 命令的基本语法格式如下:

stats

实例

在以下实例中,我们使用了 stats 命令来输出 Memcached 服务信息。

statsSTAT pid 1162STAT uptime 5022STAT time 1415208270STAT version 1.4.14STAT libevent 2.0.19-stableSTAT pointer_size 64STAT rusage_user 0.096006STAT rusage_system 0.152009STAT curr_connections 5STAT total_connections 6STAT connection_structures 6STAT reserved_fds 20STAT cmd_get 6STAT cmd_set 4STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 4STAT get_misses 2STAT delete_misses 1STAT delete_hits 1STAT incr_misses 2STAT incr_hits 1STAT decr_misses 0STAT decr_hits 1STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 262STAT bytes_written 313STAT limit_maxbytes 67108864STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 524288STAT hash_is_expanding 0STAT expired_unfetched 1STAT evicted_unfetched 0STAT bytes 142STAT curr_items 2STAT total_items 6STAT evictions 0STAT reclaimed 1END

这里显示了很多状态信息,下边详细解释每个状态项:

  • pid: memcache服务器进程ID
  • uptime:服务器已运行秒数
  • time:服务器当前Unix时间戳
  • version:memcache版本
  • pointer_size:操作系统指针大小
  • rusage_user:进程累计用户时间
  • rusage_system:进程累计系统时间
  • curr_connections:当前连接数量
  • total_connections:Memcached运行以来连接总数
  • connection_structures:Memcached分配的连接结构数量
  • cmd_get:get命令请求次数
  • cmd_set:set命令请求次数
  • cmd_flush:flush命令请求次数
  • 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:服务器是否达到过最大连接(0/1)
  • listen_disabled_num:失效的监听数
  • threads:当前线程数
  • conn_yields:连接操作主动放弃数目
  • bytes:当前存储占用的字节数
  • curr_items:当前存储的数据总数
  • total_items:启动以来存储的数据总数
  • evictions:LRU释放的对象数目
  • reclaimed:已过期的数据条目来存储新数据的数目

Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

语法:

stats items 命令的基本语法格式如下:

stats items

实例

stats itemsSTAT items:1:number 1STAT items:1:age 7STAT items:1:evicted 0STAT items:1:evicted_nonzero 0STAT items:1:evicted_time 0STAT items:1:outofmemory 0STAT items:1:tailrepairs 0STAT items:1:reclaimed 0STAT items:1:expired_unfetched 0STAT items:1:evicted_unfetched 0END

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

语法:

stats slabs 命令的基本语法格式如下:

stats slabs

实例

stats slabsSTAT 1:chunk_size 96STAT 1:chunks_per_page 10922STAT 1:total_pages 1STAT 1:total_chunks 10922STAT 1:used_chunks 1STAT 1:free_chunks 10921STAT 1:free_chunks_end 0STAT 1:mem_requested 71STAT 1:get_hits 0STAT 1:cmd_set 1STAT 1:delete_hits 0STAT 1:incr_hits 0STAT 1:decr_hits 0STAT 1:cas_hits 0STAT 1:cas_badval 0STAT 1:touch_hits 0STAT active_slabs 1STAT total_malloced 1048512END

Memcached stats sizes 命令用于显示所有item的大小和个数。

该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

语法:

stats sizes 命令的基本语法格式如下:

stats sizes

实例

stats sizesSTAT 96 1END

Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。

该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。

语法:

flush_all 命令的基本语法格式如下:

flush_all [time] [noreply]

实例

清理缓存:

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedENDflush_allOKget 51coolmaEND

使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。

以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。

连接实例

Java 连接 Memcached

import net.spy.memcached.MemcachedClient;import java.net.*;public class MemcachedJava {   public static void main(String[] args) {      try{         // 本地连接 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");                  // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

该程序中我们使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。

执行以上代码,如果连接成功会输出以下信息:

Connection to server successful.

set 操作实例

以下使用 java.util.concurrent.Future 来存储数据

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{         // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");               // 存储数据         Future fo = mcc.set("51coolma", 900, "Free Education");               // 查看存储状态         System.out.println("set status:" + fo.get());                  // 输出值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

执行程序,输出结果为:

Connection to server successful.set status:trueW3Cschool value in cache - Free Education

add 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 打印状态         System.out.println("set status:" + fo.get());         // 输出         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 添加         Future fo = mcc.add("51coolma", 900, "memcached");         // 打印状态         System.out.println("add status:" + fo.get());         // 添加新key         fo = mcc.add("codingground", 900, "All Free Compilers");         // 打印状态         System.out.println("add status:" + fo.get());                  // 输出         System.out.println("codingground value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println(ex.getMessage());      }   }}

replace 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try {         //连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加第一个 key=》value 对         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 add 方法后的状态         System.out.println("add status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 添加新的 key         fo = mcc.replace("51coolma", 900, "Largest Tutorials' Library");         // 输出执行 set 方法后的状态         System.out.println("replace status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

append 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.append("51coolma", 900, " for All");         // 输出执行 set 方法后的状态         System.out.println("append status:" + fo.get());                  // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

prepend 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Education for All");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.prepend("51coolma", 900, "Free ");         // 输出执行 set 方法后的状态         System.out.println("prepend status:" + fo.get());                  // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

CAS 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.CASValue;import net.spy.memcached.CASResponse;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());                     // 使用 get 方法获取数据         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 通过 gets 方法获取 CAS token(令牌)         CASValue casValue = mcc.gets("51coolma");         // 输出 CAS token(令牌) 值         System.out.println("CAS token - " + casValue);         // 尝试使用cas方法来更新数据         CASResponse casresp = mcc.cas("51coolma", casValue.getCas(), 900, "Largest Tutorials-Library");                  // 输出 CAS 响应信息         System.out.println("CAS Response - " + casresp);         // 输出值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

get 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 使用 get 方法获取数据         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

gets 操作实例、CAS

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.CASValue;import net.spy.memcached.CASResponse;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());                     // 从缓存中获取键为 W3Cschool 的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 通过 gets 方法获取 CAS token(令牌)         CASValue casValue = mcc.gets("51coolma");         // 输出 CAS token(令牌) 值         System.out.println("CAS value in cache - " + casValue);         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

delete 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "World's largest online tutorials library");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.delete("51coolma");         // 输出执行 delete 方法后的状态         System.out.println("delete status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

Incr/Decr 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数字值         Future fo = mcc.set("number", 900, "1000");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("value in cache - " + mcc.get("number"));         // 自增并输出         System.out.println("value in cache after increment - " + mcc.incr("number", 111));         // 自减并输出         System.out.println("value in cache after decrement - " + mcc.decr("number", 112));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

在前面章节中我们已经介绍了如何安装 Memcached 服务,接下来我们为大家介绍 PHP 如何使用 Memcached 服务。

PHP Memcache 扩展安装

PHP Memcache 扩展包下载地址:http://pecl.php.net/package/memcache,你可以下载最新稳定包(stable)。

wget http://pecl.php.net/get/memcache-2.2.7.tgz               tar -zxvf memcache-2.2.7.tgzcd memcache-2.2.7/usr/local/php/bin/phpize./configure --with-php-config=/usr/local/php/bin/php-configmake && make install

如果你是 PHP7 版本,则需要下载指定分支:

git clone -b php7 https://github.com/php-memcached-dev/php-memcached.git

如果你的系统还未编译 libmemcached,则下载编译它:https://launchpad.net/libmemcached/+download

注意:/usr/local/php/ 为php的安装路径,需要根据你安装的实际目录调整。

安装成功后会显示你的memcache.so扩展的位置,比如我的:

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

最后我们需要把这个扩展添加到php中,打开你的php.ini文件在最后添加以下内容:

[Memcache]extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"extension = memcache.so

添加完后 重新启动php,我使用的是nginx+php-fpm进程所以命令如下:

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

如果是apache的使用以下命令:

/usr/local/apache2/bin/apachectl restart

检查安装结果

/usr/local/php/bin/php -m | grep memcache

安装成功会输出:memcache。

或者通过浏览器访问 phpinfo() 函数来查看,如下图:

memcache-php

PHP 连接 Memcached

<?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 支持许多平台:Linux、FreeBSD、Solaris、Mac OS,也可以安装在Windows上。

Linux系统安装memcached,首先要先安装libevent库。

sudo apt-get install libevent libevent-deve          自动下载安装(Ubuntu/Debianyum install libevent libevent-deve                      自动下载安装(Redhat/Fedora/Centos

安装 Memcached

自动安装

Ubuntu/Debian

sudo apt-get install memcached

Redhat/Fedora/Centos

yum install memcached

FreeBSD

portmaster databases/memcached

源代码安装

从其官方网站(http://memcached.org)下载memcached最新版本。

wget http://memcached.org/latest                    下载最新版本tar -zxvf memcached-1.x.x.tar.gz                    解压源码cd memcached-1.x.x                                  进入目录./configure --prefix=/usr/local/memcached           配置make && make test                                   编译sudo make install                                   安装

Memcached 运行

Memcached命令的运行:

$ /usr/local/memcached/bin/memcached -h                           命令帮助

注意:如果使用自动安装 memcached 命令位于 /usr/local/bin/memcached

启动选项:

  • -d是启动一个守护进程;
  • -m是分配给Memcache使用的内存数量,单位是MB;
  • -u是运行Memcache的用户;
  • -l是监听的服务器IP地址,可以有多个地址;
  • -p是设置Memcache监听的端口,,最好是1024以上的端口;
  • -c是最大运行的并发连接数,默认是1024;
  • -P是设置保存Memcache的pid文件。

(1)作为前台程序运行:

从终端输入以下命令,启动memcached:

/usr/local/memcached/bin/memcached -p 11211 -m 64m -vvslab class   1: chunk size     88 perslab 11915slab class   2: chunk size    112 perslab  9362slab class   3: chunk size    144 perslab  7281中间省略slab class  38: chunk size 391224 perslab     2slab class  39: chunk size 489032 perslab     2<23 server listening<24 send buffer was 110592, now 268435456<24 server listening (udp)<24 server listening (udp)<24 server listening (udp)<24 server listening (udp)

这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211,最大内存使用量为64M。调试信息的内容大部分是关于存储的信息。

(2)作为后台服务程序运行:

# /usr/local/memcached/bin/memcached -p 11211 -m 64m -d

或者

/usr/local/memcached/bin/memcached -d -m 64M -u root -l 192.168.0.200 -p 11211 -c 256 -P /tmp/memcached.pid

我们可以通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

语法

telnet HOST PORT

命令中的 HOSTPORT 为运行 Memcached 服务的 IP 和 端口。

实例

以下实例演示了如何连接到 Memcached 服务并执行简单的 set 和 get 命令。

本实例的 Memcached 服务运行的主机为 127.0.0.1(本机) 、端口为 11211。

telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set foo 0 0 3                                                   保存命令bar                                                             数据STORED                                                          结果get foo                                                         取得命令VALUE foo 0 3                                                   数据bar                                                             数据END                                                             结束行quit                                                            退出

Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

语法:

set 命令的基本语法格式如下:

set key flags exptime bytes [noreply] value 

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → 51coolma
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 9 (数据存储的字节数)
  • value → memcached
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedEND

输出

如果数据设置成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • ERROR:在保持失败后输出。

Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

语法:

add 命令的基本语法格式如下:

add key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → new_key
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 10 (数据存储的字节数)
  • value → data_value
add new_key 0 900 10data_valueSTOREDget new_keyVALUE new_key 0 10data_valueEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED :在保持失败后输出。

Memcached replace 命令用于替换已存在的 key(键)value(数据值)

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

语法:

replace 命令的基本语法格式如下:

replace key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

以下实例中我们设置:

  • key → mykey
  • flag → 0
  • exptime → 900 (以秒为单位)
  • bytes → 10 (数据存储的字节数)
  • value → data_value

以下实例中我们使用的键位 'mykey' 并存储对应的值 data_value。执行后我们替换相同的 key 的值为 'some_other_value'。

add mykey 0 900 10data_valueSTOREDget mykeyVALUE mykey 0 10data_valueENDreplace mykey 0 900 16some_other_valueget mykeyVALUE mykey 0 16some_other_valueEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:执行替换失败后输出。

Memcached append 命令用于向已存在 key(键)value(数据值) 后面追加数据 。

语法:

append 命令的基本语法格式如下:

append key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

实例如下:

  • 首先我们在 Memcached 中存储一个键 51coolma,其值为 memcached。
  • 然后,我们使用 get 命令检索该值。
  • 然后,我们使用 append 命令在键为 51coolma 的值后面追加 "redis"。
  • 最后,我们再使用 get 命令检索该值。
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 14memcachedENDappend 51coolma 0 900 5redisSTOREDget 51coolmaVALUE 51coolma 0 14memcachedredisEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:该键在 Memcached 上不存在。
  • CLIENT_ERROR:执行错误。

Memcached prepend 命令用于向已存在 key(键)value(数据值) 前面追加数据 。

语法:

prepend 命令的基本语法格式如下:

prepend key flags exptime bytes [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

实例如下:

  • 首先我们在 Memcached 中存储一个键 51coolma,其值为 memcached。
  • 然后,我们使用 get 命令检索该值。
  • 然后,我们使用 prepend 命令在键为 51coolma 的值后面追加 "redis"。
  • 最后,我们再使用 get 命令检索该值。
set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 14memcachedENDprepend 51coolma 0 900 5redisSTOREDget 51coolmaVALUE 51coolma 0 14redismemcachedEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • NOT_STORED:该键在 Memcached 上不存在。
  • CLIENT_ERROR:执行错误。

Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作

它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

语法:

CAS 命令的基本语法格式如下:

cas key flags exptime bytes unique_cas_token [noreply]value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • unique_cas_token通过 gets 命令获取的一个唯一的64位值。
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例

要在 Memcached 上使用 CAS 命令,你需要从 Memcached 服务商通过 gets 命令获取令牌(token)。

gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的 "版本" 标识符。

实例步骤如下:

  • 如果没有设置唯一令牌,则 CAS 命令执行错误。
  • 如果键 key 不存在,执行失败。
  • 添加键值对。
  • 通过 gets 命令获取唯一令牌。
  • 使用 cas 命令更新数据
  • 使用 get 命令查看数据是否更新
cas tp 0 900 9ERROR             <− 缺少 tokencas tp 0 900 9 2memcachedNOT_FOUND         <−  tp 不存在set tp 0 900 9memcachedSTOREDgets tpVALUE tp 0 9 1memcachedENDcas tp 0 900 5 1redisSTOREDget tpVALUE tp 0 5redisEND

输出

如果数据添加成功,则输出:

STORED

输出信息说明:

  • STORED:保存成功后输出。
  • ERROR:保存出错或语法错误。
  • EXISTS:在最后一次取值后另外一个用户也在更新该数据。
  • NOT_FOUND:Memcached 服务上不存在该键值。

Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

语法:

get 命令的基本语法格式如下:

get key

多个 key 使用空格隔开,如下:

get key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedEND

Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。

语法:

gets 命令的基本语法格式如下:

gets key

多个 key 使用空格隔开,如下:

gets key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。

set 51coolma 0 900 9memcachedSTOREDgets 51coolmaVALUE 51coolma 0 9 1memcachedEND

在 使用 gets 命令的输出结果中,在最后一列的数字 1 代表了 key 为 51coolma 的 CAS 令牌。

Memcached delete 命令用于删除已存在的 key(键)。

语法:

delete 命令的基本语法格式如下:

delete key [noreply]

多个 key 使用空格隔开,如下:

delete key1 key2 key3

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • noreply(可选): 该参数告知服务器不需要返回数据

实例

在以下实例中,我们使用 51coolma 作为 key,过期时间设置为 900 秒。之后我们使用 delete 命令删除该 key。

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedENDdelete 51coolmaDELETEDget 51coolmaENDdelete 51coolmaNOT_FOUND

输出

输出信息说明:

  • DELETED:删除成功。
  • ERROR:语法错误或删除失败。
  • NOT_FOUND:key 不存在。

Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR


incr 命令

语法:

incr 命令的基本语法格式如下:

incr key increment_value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • increment_value: 增加的数值。

实例

在以下实例中,我们使用 visitors 作为 key,初始值为 10,之后进行加 5 操作。

set visitors 0 900 210STOREDget visitorsVALUE visitors 0 210ENDincr visitors 515get visitorsVALUE visitors 0 215END

输出

输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。

decr 命令

decr 命令的基本语法格式如下:

decr key decrement_value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • decrement_value: 减少的数值。

实例

set visitors 0 900 210STOREDget visitorsVALUE visitors 0 210ENDdecr visitors 55get visitorsVALUE visitors 0 15END

在以下实例中,我们使用 visitors 作为 key,初始值为 10,之后进行减 5 操作。

输出

输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。

Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

语法:

stats 命令的基本语法格式如下:

stats

实例

在以下实例中,我们使用了 stats 命令来输出 Memcached 服务信息。

statsSTAT pid 1162STAT uptime 5022STAT time 1415208270STAT version 1.4.14STAT libevent 2.0.19-stableSTAT pointer_size 64STAT rusage_user 0.096006STAT rusage_system 0.152009STAT curr_connections 5STAT total_connections 6STAT connection_structures 6STAT reserved_fds 20STAT cmd_get 6STAT cmd_set 4STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 4STAT get_misses 2STAT delete_misses 1STAT delete_hits 1STAT incr_misses 2STAT incr_hits 1STAT decr_misses 0STAT decr_hits 1STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 262STAT bytes_written 313STAT limit_maxbytes 67108864STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 524288STAT hash_is_expanding 0STAT expired_unfetched 1STAT evicted_unfetched 0STAT bytes 142STAT curr_items 2STAT total_items 6STAT evictions 0STAT reclaimed 1END

这里显示了很多状态信息,下边详细解释每个状态项:

  • pid: memcache服务器进程ID
  • uptime:服务器已运行秒数
  • time:服务器当前Unix时间戳
  • version:memcache版本
  • pointer_size:操作系统指针大小
  • rusage_user:进程累计用户时间
  • rusage_system:进程累计系统时间
  • curr_connections:当前连接数量
  • total_connections:Memcached运行以来连接总数
  • connection_structures:Memcached分配的连接结构数量
  • cmd_get:get命令请求次数
  • cmd_set:set命令请求次数
  • cmd_flush:flush命令请求次数
  • 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:服务器是否达到过最大连接(0/1)
  • listen_disabled_num:失效的监听数
  • threads:当前线程数
  • conn_yields:连接操作主动放弃数目
  • bytes:当前存储占用的字节数
  • curr_items:当前存储的数据总数
  • total_items:启动以来存储的数据总数
  • evictions:LRU释放的对象数目
  • reclaimed:已过期的数据条目来存储新数据的数目

Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

语法:

stats items 命令的基本语法格式如下:

stats items

实例

stats itemsSTAT items:1:number 1STAT items:1:age 7STAT items:1:evicted 0STAT items:1:evicted_nonzero 0STAT items:1:evicted_time 0STAT items:1:outofmemory 0STAT items:1:tailrepairs 0STAT items:1:reclaimed 0STAT items:1:expired_unfetched 0STAT items:1:evicted_unfetched 0END

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

语法:

stats slabs 命令的基本语法格式如下:

stats slabs

实例

stats slabsSTAT 1:chunk_size 96STAT 1:chunks_per_page 10922STAT 1:total_pages 1STAT 1:total_chunks 10922STAT 1:used_chunks 1STAT 1:free_chunks 10921STAT 1:free_chunks_end 0STAT 1:mem_requested 71STAT 1:get_hits 0STAT 1:cmd_set 1STAT 1:delete_hits 0STAT 1:incr_hits 0STAT 1:decr_hits 0STAT 1:cas_hits 0STAT 1:cas_badval 0STAT 1:touch_hits 0STAT active_slabs 1STAT total_malloced 1048512END

Memcached stats sizes 命令用于显示所有item的大小和个数。

该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

语法:

stats sizes 命令的基本语法格式如下:

stats sizes

实例

stats sizesSTAT 96 1END

Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。

该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。

语法:

flush_all 命令的基本语法格式如下:

flush_all [time] [noreply]

实例

清理缓存:

set 51coolma 0 900 9memcachedSTOREDget 51coolmaVALUE 51coolma 0 9memcachedENDflush_allOKget 51coolmaEND

使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。

以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。

连接实例

Java 连接 Memcached

import net.spy.memcached.MemcachedClient;import java.net.*;public class MemcachedJava {   public static void main(String[] args) {      try{         // 本地连接 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");                  // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

该程序中我们使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。

执行以上代码,如果连接成功会输出以下信息:

Connection to server successful.

set 操作实例

以下使用 java.util.concurrent.Future 来存储数据

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{         // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");               // 存储数据         Future fo = mcc.set("51coolma", 900, "Free Education");               // 查看存储状态         System.out.println("set status:" + fo.get());                  // 输出值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

执行程序,输出结果为:

Connection to server successful.set status:trueW3Cschool value in cache - Free Education

add 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 打印状态         System.out.println("set status:" + fo.get());         // 输出         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 添加         Future fo = mcc.add("51coolma", 900, "memcached");         // 打印状态         System.out.println("add status:" + fo.get());         // 添加新key         fo = mcc.add("codingground", 900, "All Free Compilers");         // 打印状态         System.out.println("add status:" + fo.get());                  // 输出         System.out.println("codingground value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println(ex.getMessage());      }   }}

replace 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try {         //连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加第一个 key=》value 对         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 add 方法后的状态         System.out.println("add status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 添加新的 key         fo = mcc.replace("51coolma", 900, "Largest Tutorials' Library");         // 输出执行 set 方法后的状态         System.out.println("replace status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex){         System.out.println( ex.getMessage() );      }   }}

append 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.append("51coolma", 900, " for All");         // 输出执行 set 方法后的状态         System.out.println("append status:" + fo.get());                  // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

prepend 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Education for All");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.prepend("51coolma", 900, "Free ");         // 输出执行 set 方法后的状态         System.out.println("prepend status:" + fo.get());                  // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

CAS 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.CASValue;import net.spy.memcached.CASResponse;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());                     // 使用 get 方法获取数据         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 通过 gets 方法获取 CAS token(令牌)         CASValue casValue = mcc.gets("51coolma");         // 输出 CAS token(令牌) 值         System.out.println("CAS token - " + casValue);         // 尝试使用cas方法来更新数据         CASResponse casresp = mcc.cas("51coolma", casValue.getCas(), 900, "Largest Tutorials-Library");                  // 输出 CAS 响应信息         System.out.println("CAS Response - " + casresp);         // 输出值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

get 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 使用 get 方法获取数据         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

gets 操作实例、CAS

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.CASValue;import net.spy.memcached.CASResponse;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "Free Education");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());                     // 从缓存中获取键为 W3Cschool 的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 通过 gets 方法获取 CAS token(令牌)         CASValue casValue = mcc.gets("51coolma");         // 输出 CAS token(令牌) 值         System.out.println("CAS value in cache - " + casValue);         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

delete 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数据         Future fo = mcc.set("51coolma", 900, "World's largest online tutorials library");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("51coolma"));         // 对存在的key进行数据添加操作         Future fo = mcc.delete("51coolma");         // 输出执行 delete 方法后的状态         System.out.println("delete status:" + fo.get());         // 获取键对应的值         System.out.println("51coolma value in cache - " + mcc.get("codingground"));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

Incr/Decr 操作实例

import java.net.InetSocketAddress;import java.util.concurrent.Future;import net.spy.memcached.MemcachedClient;public class MemcachedJava {   public static void main(String[] args) {         try{            // 连接本地的 Memcached 服务         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));         System.out.println("Connection to server sucessful.");         // 添加数字值         Future fo = mcc.set("number", 900, "1000");         // 输出执行 set 方法后的状态         System.out.println("set status:" + fo.get());         // 获取键对应的值         System.out.println("value in cache - " + mcc.get("number"));         // 自增并输出         System.out.println("value in cache after increment - " + mcc.incr("number", 111));         // 自减并输出         System.out.println("value in cache after decrement - " + mcc.decr("number", 112));         // 关闭连接         mcc.shutdown();               }catch(Exception ex)         System.out.println(ex.getMessage());   }}

在前面章节中我们已经介绍了如何安装 Memcached 服务,接下来我们为大家介绍 PHP 如何使用 Memcached 服务。

PHP Memcache 扩展安装

PHP Memcache 扩展包下载地址:http://pecl.php.net/package/memcache,你可以下载最新稳定包(stable)。

wget http://pecl.php.net/get/memcache-2.2.7.tgz               tar -zxvf memcache-2.2.7.tgzcd memcache-2.2.7/usr/local/php/bin/phpize./configure --with-php-config=/usr/local/php/bin/php-configmake && make install

如果你是 PHP7 版本,则需要下载指定分支:

git clone -b php7 https://github.com/php-memcached-dev/php-memcached.git

如果你的系统还未编译 libmemcached,则下载编译它:https://launchpad.net/libmemcached/+download

注意:/usr/local/php/ 为php的安装路径,需要根据你安装的实际目录调整。

安装成功后会显示你的memcache.so扩展的位置,比如我的:

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

最后我们需要把这个扩展添加到php中,打开你的php.ini文件在最后添加以下内容:

[Memcache]extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"extension = memcache.so

添加完后 重新启动php,我使用的是nginx+php-fpm进程所以命令如下:

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

如果是apache的使用以下命令:

/usr/local/apache2/bin/apachectl restart

检查安装结果

/usr/local/php/bin/php -m | grep memcache

安装成功会输出:memcache。

或者通过浏览器访问 phpinfo() 函数来查看,如下图:

memcache-php

PHP 连接 Memcached

<?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;?>