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"

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

 

posted @ 2020-06-21 15:32  Praywu  阅读(796)  评论(0编辑  收藏  举报