|
|

这一周都在看memcached源代码,看完各个文件再结合一些前人写的心得,昨天再重新过一遍memecached的源代码,总算有了总体上的理解。本来想写篇学习笔记,可是太懒了写了一会又放弃,而且前人写的分析已经很详细了,参考他们的就好了。
新认识了memcache的几个地方,第一就是新增的几个命令:cas append prepend,
cas命令是用来改变一个存在的key的值,但它还带了检查的功能,原文如下:
“cas” is a check and set operation which means “store this data but only if no one else has updated since I last fetched it.”
意思是说如果这个值我最后一次取的没有被修改的话才存储这个值,比如我先获取一个key为”update_time”的值,然后有其他进程修改了这个值,此时我再调用cas设置这个值时则会返回一个EXSISTS的错误表示修改失败。
cas命令的语法是这样:cas key flags exptime cas_unique,
最后一个参数表示这个key的版本,是在调用gets命令获取的时候返回的。
gets uptime
VALUE uptime 0 10 2
2008-03-20
END
最后一个2就是这个key的修改版本,需要用cas更新这个值:
cas uptime 0 0 10 2
2008-03-22
append和prepend是在这个值后面或前面插入新值
append uptime 0 0 10
(18:30:26)
再查看:
get uptime
2008-03-22(19:30:26)
另外在调用stats命令查看memcached服务器具体信息的时候,有这样的一行:
STAT evictions 0
这个evictions是表示因为要腾出新的空间给新的item而移去的合法的item数目,可以参考这个参数状态来决定是否需要给memcached服 务器增加内存,如果后面的那个数值很大那说明分配的内存不够以致memcached不得不挪走当前还有用的item来存放的item.
memcached用了slab allocator(内存分配器)来管理内存,而不是用系统自带的malloc,因为用malloc会产生很多内存碎片。memcached在启动时会申 请一块很大的内存,然后用它的slab allocator来管理内存,这样就不用每存一个item就需要调用一次malloc,删除item的时候也不会free掉这块内存空间,具体的申请内 存的操作可以参考do_slabs_alloc这个函数。当然memcached也支持系统的malloc方式申请内存,只要在编译的时候定义 USE_SYSTEM_MALLOC宏就可以了。
从1.2.2版本以后memcached就开始支持多线程了,在编译的时候定义USE_THREADS宏就可以。默认会创建4个线程,主线程用于监 听客户建立的连接请求、accpet请求,然后通过管道通知子线程,由子线程处理读写请求。memcached的多线程主要是通过实例化多个 libevent实现的,分别是一个主线程和n个workers线程,无论是主线程还是workers线程全部通过libevent管理网络事件,实际上 每个线程都是一个单独的libevent实例。 |
|