Saturday, April 07, 2012

Memcached笔记

编译:

$ ./autogen.sh
$ ./configure
$ make
运行server
$ ./memcached -p 9527
这样memcached会在server上监听9527这个端口, 你也可以制定一个其他端口 (默认是11211) 如果需要看到多一些输出信息, 可以加上参数 -v -vv 或者-vvv
-p 端口号使用的TCP端口。默认为11211
-U 端口号使用的UDP端口。默认为11211
-m 内存大小(MB)最大内存大小。默认为64M
-t 线程数目使用多少个工作线程. 默认为4
-v,-vv,-vvv用very vrebose模式启动,调试信息和错误输出到控制台
-d作为daemon在后台启动

测试:

在本机用telnet运行client


$ telnet localhost 9527
set key1 14 0 1
a
STORED
get key1
VALUE key1 14 1
a
END
一些内部机制:

内存管理:

memcached将内存划分成1MB大小的单位,称作slab. 每个slab划分成许多相同大小的slot来存储key-value pair. 但是每个slab可能有不同的等级--根据这个等级,slot的大小不同.
图片来源:http://nosql.mypopescu.com/post/13506116892/memcached-internals-memory-allocation-eviction

LRU算法:

memcached 使用 LRU per slab class, not globally.

item:

每一个key-value pair的metadata存储在一个item结构当中
  • it_flags: 可以是如下几个标志的组合
    • ITEM_LINKED: 此item加入了LRU list
    • ITEM_CAS: 我暂时还不知到...
    • ITEM_FETCHED: 此item被access过
    • ITEM_SLABBED: 此item已经被free了
  • next, prev: per-slab LRU是用一个双向链表来实现的, 这两个指针就指向链表中前后item
  • h_next: 指针, 指向每个item在hashtable中下一个item(该hashtable使用chaining来实现)
  • time: 最近一次访问时间(用于检查该item是否expire)
  • exptime: expire时间(记住memcached是一个cache)
参考

memcached全面剖析–PDF总结篇
memcached源码分析(一): memcached.c主函数分析
memcached源码分析(二): settings结构体分析
memcached源码分析(三):socket建立过程分析
memcached源码分析(四):事件状态机分析
memcached源码分析(五):数据保存及内存管理
memcached源码分析(六):总结几个小点 Memcached internals

No comments: