Memcache

Memcache 是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。这是一套开放源代码软件,以BSD license授权发布。

Memcached是以守护程序(daemon 监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。


原理

在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。

Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 ,

最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 60*60*24*30控制

最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制

单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,

它是默认的slab大小

最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过 settings.maxconns=1024 进行控制

跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式

memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。

memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。

memcached作为小规模的数据分布式平台是十分有效果的。

memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。

网络协议

启动命令

memcached -d -u root -l 127.0.0.1 -m 1024 -p 11211
  • 后台执行
  • 使用root用户身份
  • 监听127.0.0.1 (可选)
  • 监听11211端口
  • 分配 1024MB 内存

使用建议

  • 不要轻易重启memcached,会导致数据全部丢失
  • 不要轻易使用 flush_all
  • 定期检查缓存命中率
  • 主动预热数据
  • 防止key冲突,分离环境,防止脏数据

一致性hash

缓存命中率

过期策略

  • lru,least recently used, 最近没有用,那么就被淘汰
  • lfu, least frequently used, 使用的总体次数比较少
  • fifo, 先进先出

常用命令

连接和断开

# telnet localhost 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

断开连接 ctrl + ] , 然后输入 q

set 设置内容

set k 0 0 8
12345678
STORED

get 获取内容

get k
VALUE k 0 8
12345678
END

stats 查看运行状态

stats

STAT pid 22064
STAT uptime 6
STAT time 1440987408
STAT version 1.4.22
STAT libevent 2.0.22-stable
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.005999
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 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 touch_hits 0
STAT touch_misses 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 hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT lrutail_reflocked 0
END

字段说明如下:

pid     memcache服务器的进程ID
uptime     服务器已经运行的秒数
time     服务器当前的unix时间戳
version     memcache版本
pointer_size     当前操作系统的指针大小(32位系统一般是32bit)
rusage_user     进程的累计用户时间
rusage_system     进程的累计系统时间
curr_items     服务器当前存储的items数量
total_items     从服务器启动以后存储的items总数量
bytes     当前服务器存储items占用的字节数
curr_connections     当前打开着的连接数
total_connections     从服务器启动以后曾经打开过的连接数
connection_structures     服务器分配的连接构造数
cmd_get     get命令(获取)总请求次数
cmd_set     set命令(保存)总请求次数
get_hits     总命中次数
get_misses     总未命中次数
evictions     为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read     总读取字节数(请求字节数)
bytes_written     总发送字节数(结果字节数)
limit_maxbytes     分配给memcache的内存大小(字节)
threads     当前线程数

参考资料