memcache可以看成是一个大内存库,因为可以集群,所以可以看成是无限大的内存库。既然是内存库,那么我们放的就是一些map了。map里就键值对,虽然内存可以通过集群的方式无限扩展,但单个键值对的大小确是受限的。目前memcache的单个缓存key最大是250字节,也就是不能超过250个字符(ASCII码),value最大是1M。另外memcache虽说也是可以设置永久缓存的,但其实这里的“永久”就是30天,过期时间一到map就失效了。
我用的是64位的win10操作系统,直接到memcache官网只能下载到Linux版本的,windows版本的64位memcached-win64-1.4.4-14下载地址:http://static.runoob.com/download/memcached-win64-1.4.4-14.zip,解压到E盘memcached目录后,打开命令行窗口,进入到我们的memcached目录,执行安装命令:
E:memcached>memcached.exe -d install
执行启动命令:
E:memcached>memcached.exe -d start
如果执行以上命令报错failed to install service or service already installed,说明没有执行权限。进入到C:WindowsSystem32,找到cmd.exe,右键选择“以管理员身份运行”即可。或者在点击左下角的开始按钮 -> 在弹出的框框中找到命令行图标 -> 右键图标 -> 更多 -> 以管理员身份运行。 这时memcache应该可以起来了,直接在memcached的安装目录双击memcached.exe也能启动。关闭就更简单了,直接把命令行关了就ok了。
那么如何通过memcached客户端连接到服务端呢?可以通过telnet来连接,因为默认端口是11211,所以使用连接命令如下即可
telnet 127.0.0.1 11211
如果执行telnet被告知“不是内部或外部命令”,说明没打开执行权限。打开方法:控制面板->程序->程序和功能->启用或关闭Windows功能->telnet客户端打开、确定。
如果想换端口,比如换到11200端口,执行如下命令
memcached -m 1024 -p 11200
参数m是用来指定缓存的内存大小的,单位是M,所以这里指定的是1G。其他参数如下:
-d 选项是启动一个守护进程,
-u 是运行Memcache的用户
-l 是监听的服务器IP地址
-c 选项是最大运行的并发连接数,默认是1024
-P 是设置保存Memcache的pid文件
注意:以上命令连接到memcached后窗口光标会一直闪烁,无法继续命令,所以需要打开新窗口执行telnet命令。另外该命令在窗口关闭后失效。
通过telnet连接到memcached后(我本机连过去后是黑屏,不过执行一条命令后就能显示了),可以通过stats命令看缓存状态:
STAT pid 5428 STAT uptime 3054537999 STAT time 268839299 STAT version 1.4.4-14-g9c660c0 STAT pointer_size 64 STAT curr_connections 10 STAT total_connections 11 STAT connection_structures 11 STAT cmd_get 0 STAT cmd_set 0 STAT cmd_flush 0 STAT get_hits 0 STAT get_misses 0 STAT delete_misses 0 STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 7 STAT bytes_written 0 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 0 STAT curr_items 0 STAT total_items 0 STAT evictions 0 END
下面详细说下memcached的参数
参 数 名 | 作 用 |
pid | MemCache服务器的进程id |
uptime | 服务器已经运行的秒数 |
time | 服务器当前的UNIX时间戳 |
version | MemCache版本 |
pointer_size | 当前操作系统指针大小,反映了操作系统的位数,64意味着MemCache服务器是64位的 |
rusage_user | 进程的累计用户时间 |
rusage_system | 进程的累计系统时间 |
curr_connections | 当前打开着的连接数 |
total_connections | 当服务器启动以后曾经打开过的连接数 |
connection_structures | 服务器分配的连接构造数 |
cmd_get | get命令总请求次数 |
cmd_set | set命令总请求次数 |
cmd_flush | flush_all命令总请求次数 |
get_hits | 总命中次数,重要,缓存最重要的参数就是缓存命中率,以get_hits / (get_hits + get_misses)表示,比如这个缓存命中率就是99.2% |
get_misses | 总未命中次数 |
auth_cmds | 认证命令的处理次数 |
auth_errors | 认证失败的处理次数 |
bytes_read | 总读取的字节数 |
bytes_written | 总发送的字节数 |
limit_maxbytes | 分配给MemCache的内存大小(单位为字节) |
accepting_conns | 是否已经达到连接的最大值,1表示达到,0表示未达到 |
listen_disabled_num | 统计当前服务器连接数曾经达到最大连接的次数,这个次数应该为0或者接近于0,如果这个数字不断增长, 就要小心我们的服务了 |
threads | 当前MemCache总线程数,由于MemCache的线程是基于事件驱动机制的,因此不会一个线程对应一个用户请求 |
bytes | 当前服务器存储的items总字节数 |
current_items | 当前服务器存储的items总数量 |
total_items | 自服务器启动以后存储的items总数量 |
memcached常用命令:
命 令 | 作 用 |
get | 返回Key对应的Value值 |
add | 添加一个Key值,没有则添加成功并提示STORED,有则失败并提示NOT_STORED |
set | 无条件地设置一个Key值,没有就增加,有就覆盖,操作成功提示STORED |
replace | 按照相应的Key值替换数据,如果Key值不存在则会操作失败 |
stats | 返回MemCache通用统计信息(下面有详细解读) |
stats items | 返回各个slab中item的数目和最老的item的年龄(最后一次访问距离现在的秒数) |
stats slabs | 返回MemCache运行期间创建的每个slab的信息(下面有详细解读) |
version | 返回当前MemCache版本号 |
flush_all | 清空所有键值,但不会删除items,所以此时MemCache依旧占用内存 |
quit | 关闭连接 |
添加缓存add格式:add key flags expiretime bytes databolck
add wlf 32 0 4 java STORED get wlf VALUE wlf 32 4 java END
注意bytes的字节数必须要跟databolck对应起来。比如我这里是4,那么对应的“java”就必须是4位的字符串,否则将报错”CLIENT_ERROR bad data chunk“。执行add命令的前提是key必须不存在,否则将直接抛出一个ERROR。set命令可以覆盖已存在的key值。下面再把参数详细说明一下:
<command> <key> <flags> <exptime> <bytes> [<version>]
< datablock>
< status>
command | set无论如何都进行存储 add只有数据不存在时进行添加 repalce只有数据存在时进行替换 append往后追加:append <key> datablock <status> prepend往前追加:prepend <key> datablock <status> cas按版本号更改 |
客户端用来标识数据格式的数值,如json,xml,压缩等 | |
不包含 ,根据长度截取存/取的字符串,可以是0,即存空串 | |
datablock | 文本行,以 结尾,当然可以包含 或 |
status | STORED/NOT_STORED/EXISTS/NOT_FOUND ERROR/CLIENT_ERROR/SERVER_ERROR服务端会关闭连接以修复 |