1. Memcached概述
1.1 memcached简介
- LiveJournel旗下Danga Interactive公司Brad所研发
- 高性能key/value数据缓存
1.2 软件系统
- 结构化数据:RDBMS
- 半结构化数据:JSON(Documentation) --> NoSQL
- 非结构化数据:存储在文件系统上
- 分布式:文件系统、存储
- 提供FUSE这样的接口提供给用户,让用户依旧能挂载访问使用
1.3 memcached的特点
- 协议简单(客户端和服务器交互时基于最简单的纯文本格式的协议)
- 基于libevent事件处理
- 基于内存完成数据存储:基于LRU算法完成内存空间自动清除
- memcached互不通信的集群:分布式工作机制
1.4 memcached的配置文件
- unit文件:/usr/lib/systemd/system/memcached.service
- 主配置文件:/etc/sysconfig/memcached
PORT="11211" # 端口,同时监听tcp和udp的11211端口,其中udp端口可以关闭
USER="memcached" # 运行的用户名
MAXCONN="1024" # 最大并发连接数
CACHESIZE="64" # 内存空间大小
OPTIONS="" # 指定额外的选项
1.5 memcached工作过程图示

- 旁挂式缓存:智能性一半在客户端,一半在服务端
- Memcached真正要缓存什么,是由用户来定义的
2. Memcached指令的选项
2.1 默认的参数
- memcached -u memcached -p 11211 -m 32 -c 1024
2.2 memcached指令选项详解
-s <file>
Unix socket path to listen on (disables network support).
# 使用本地的套接字通信,基于内存共享的方式向本机提供服务
-l <ip_addr>
Listen on <ip_addr>; default to INADDR_ANY.
# 监听的地址,默认监听本地所有地址
-d Run memcached as a daemon.
# 将memcached运行为守护进程
-u <username>
Assume the identity of <username> (only when run as root).
# 以指定用户的身份运行memcached
-m <num>
Use <num> MB memory max to use for object storage; the default is 64 megabytes.
# 使用的内存空间,默认为64M
-c <num>
Use <num> max simultaneous connections; the default is 1024.
# 最大并发连接数,默认为1024
-p <num>
Listen on TCP port <num>, the default is port 11211.
# 监听的tcp端口,默认端口为11211
-U <num>
Listen on UDP port <num>, the default is port 11211, 0 is off.
# 监听的udp端口,默认为11211,且设置成0表示关闭
-M Disable automatic removal of items from the cache when out of memory. Additions will
not be possible until adequate space is freed up.
# 禁止使用LRU算法去清理内存
-f <factor>
The default is 1.25.
# 增长因子,默认为1.25
-v Be verbose during the event loop; print out errors and warnings.
# 显示详细信息
-vv Be even more verbose; same as -v but also print client commands and responses.
# 显示更详细的信息
-t <threads>
Number of threads to use to process incoming requests. The default is 4.
# 指明memcached提供服务的线程数,默认为4个
-B <proto>
Specify the binding protocol to use. By default, the server will autonegotiate client
connections. By using this option, you can specify the protocol clients must speak.
Possible options are "auto" (the default, autonegotiation behavior),
"ascii" and "binary".
# 所支持的协议,有两种,ascii和binary,默认是自动选择
3. Memcached内存存储机制
3.1 Memcached利用Slab Allocation机制来分配和管理内存
- Slab Allocation内存分配管理机制:整理内存以进行复用
3.2 Slab Allocation机制原理
- 先按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块(chunk)
- 再把尺寸相同的内存块分成组(chunks slab class),这些内块不会释放,可以重复利用
- Memcached服务器端中保存着slab内空闲的chunk的列表,根据该列表选择chunk,然后将数据缓存于其中
- Memcached会根据收到的数据的大小,选择最合适大小的slab分配一个能存在这个数据的最小内存块(chunk)
- 但是这个chunk中多余的空间会被浪费,这是此机制的缺点
- Slab Allocator还可以重复使用已分配内存的作用,也就是说,分配到的内存不会释放,而是重复利用
3.3 Slab Allocation的重要术语
- Page: 分配给slab的内存空间,默认是1MB,分配给Slab之后根据Slab的大小切分成chunk
- chunk:用于缓存缓存对象的存储空间
- slab class:同一组特定大小的chunk组合而成的组
- 特别注意:超过1M的数据Memcached无法缓存
3.4 memcached-tool查看stats
- 使用:
- 显示:
-
[root@c7_node_03 /]# memcached-tool 127.0.0.1
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
1 96B 8299s 1 1 yes 0 0 0
- 显示信息的含义:
- #:slab class的编号(说明哪一种slab被占据了多少个)
- Item_size:Chunk大小
- Max_age:缓存对象的生存时间,已经存在多长时间了
- Pages:分配给slab的内存页数
- Count:slab内的记录数
- Full?:slab内是否仍有空闲chunk
3.5 查看各级别的chunk&调整增长因子
- 查看各级别的chunk:
- memcached -u memcached -vv
- 调整增长因子可以用 -f 参数(默认是1.25倍)
- memcached -u memcached -p 11211 -m 32 -c 1024 -f 1.1
- 若要永久保存,可以写入到/etc/sysconfig/memcached文件中的OPTIONS中:
4. Memcached命令操作语法
4.1 语法格式及参数
- 语法格式:
- <command name> <key> <flag> <expire> <bytes>
- <data block>
- 参数说明:
- <command name>:命令的名称
- <key>:查找的关键字
- <flag>:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- <expire>:键值对的保存时长,以秒为单位,0表示永远
- <bytes>:存储数据的字节数
- <data block>:存储的数据
4.2 存储命令
4.2.1 set
set mykey 0 600 5
hello
STORED
# 表示存储一个键名为mykey的数据,存储时间为600秒,占据5个字节,存储内容为hello
# 如果显示STORED,则表明数据已经存储完成
4.2.2 add
add mykey_2 0 600 5 # 存储一个先前不存在的键值对数据
world
STORED
add mykey_2 0 600 5 # 因为这个键已经存在了,所以无法存储成功
hello
NOT_STORED
4.2.3 replace
replace mykey 0 600 3 # 将名为mykey的键的值替换为123
123
STORED
4.3 读取命令
4.3.1 get key
get mykey mykey_1 # 获取mykey和mykey_1键对应的值和相关信息
VALUE mykey 0 3
123
VALUE mykey_1 0 5
hello
END
4.3.2 gets key
- 与get一样,但是会多返回一个数字,这个数字用来检查数据是否被修改过,如果修改过,这个数字会改变
gets mykey_1
VALUE mykey_1 0 5 6
hello
END
4.3.3 cas
- 及checked and set,当最后一个参数与gets返回的数字一致时才存储,否则就返回EXISTS
cas mykey 0 0 3 8
456
EXISTS
cas mykey 0 0 3 9
456
STORED
4.4 追加与清除命令
4.4.1 append
- 将数据追加到当前缓存数据的后面,当缓存数据存在时才存储
append mykey 0 0 3
456
STORED
4.4.2 prepend
- 将数据追加到当前缓存数据的后面,当缓存数据存在时才存储
prepend mykey 0 0 3
456
STORED
4.4.3 delete
- 删除缓存数据,数据存在返回DELETED,数据不存在则返回NOT_FOUND
4.4.4 flush_all
4.5 状态信息
4.5.1 stats
pid Memcached 进程ID
uptime Memcached 运行时间,单位:秒
time Memcached 当前的UNIX时间
version Memcached 的版本号
rusage_user 该进程累计的用户时间,单位:秒
rusage_system 该进程累计的系统时间,单位:秒
curr_items Memcached 当前存储的内容数量
total_items Memcached 启动以来存储过的内容总数
bytes Memcached 当前存储内容所占用的字节数(*/1024/1024=mb)
curr_connections 当前连接数量
total_connections Memcached 运行以来接受的连接总数
connection_structures Memcached 分配的连接结构的数量
cmd_get 查询请求总数
cmd_set 存储(添加/更新)请求总数
get_hits 查询成功获取数据的总次数
get_misses 查询成功未获取到数据的总次数
bytes_read Memcached 从网络读取到的总字节数
bytes_written Memcached 向网络发送的总字节数
limit_maxbytes Memcached 在存储时被允许使用的字节总数
4.5.2 stats items
- 可以看到STAT items行,如果memcached存储内容很多,那么这里也会列出很多STAT items行
stats items
STAT items:1:number 1
STAT items:1:age 12
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
4.5.3 stats slabs
- 显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 10921
STAT 1:free_chunks_end 0
STAT 1:mem_requested 75
STAT 1:get_hits 10
STAT 1:cmd_set 10
STAT 1:delete_hits 1
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
4.5.4 stats sizes
stats sizes
STAT 96 1
END
4.5.5 stats reset