Memcached详解
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
- 使用:
- memcached-tool 127.0.0.1
- 显示:
-
[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
- 此处将增长因此调整为1.1
- 若要永久保存,可以写入到/etc/sysconfig/memcached文件中的OPTIONS中:
- OPTIONS="-f 1.1"
- memcached -u memcached -p 11211 -m 32 -c 1024 -f 1.1
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
delete mykey
DELETED
4.4.4 flush_all
- 将当前所有缓存数据设置为过期,但不会释放内存
flush_all
OK
4.5 状态信息
4.5.1 stats
- 查看memcached运行状态
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
- 输出所有item的大小和个数
stats sizes STAT 96 1 END
4.5.5 stats reset
- 清空统计数据
stats reset
RESET