memcache简要学习

最近在使用memcache,通过网上文档及公司的文档,对memcache进行了简要学习。

memcache是啥:

一句话:就是缓存。任何访问后端(如mysql等)的内容,返回结果都可存储在memcache中(按照key-value),下次同样key请求时,直接访问memcache,获取结果。好处是:一是降低后端压力,二是提高响应速度;

安装:

不多讲。网上内容超级多,tar.gz解压缩之后,老套路:configure, make, make install。

怎么用:

./bin/memcached -p 11211 -m 24000 参数很多。-p是端口,即使用哪个端口启动memcache;-m是分配内存大小,单位是M;其他如:-d 是否是以daemon运行。等等,其他参数,自行使用memcached -help来看

memcache分布式存储:

说是分布式存储,但是各个server之间,并不会同步数据。即不会进行数据共享。

保存数据方法:

add/replace/set set最NB,不管是否数据,都强求写入;add是之前有这个数据不写,没有的话 ,在写入;replace是有数据就替换,没有的话,不进行操作。

内存分配:

最土的方式是频繁的malloc/free,这种方式会导致严重的内存碎片。因此memcache使用了新的机制:slab机制,即按照预先规定的大小,将分配的内存分割成特定长度的块,完全解决内存碎片问题。同时,slab有重复使用已分配内存的目的,即分配的内存不被释放。如下图:

slab1                                                      slab2

chunks chunks

88bytes 88bytes 112bytes    112bytes

88bytes.. 112bytes...

slab3

chunks

144 bytes   144bytes

144bytes...

关于slab机制,首先明确如下概念:

a.      slab class:  会有N个slab class,每个slab class都对外分配固定大小的内存,不同slab class对外分配的内存大小也不一样。一般初始化的时候,会根据factor确定每个slab class所要分配的内存大小

b.      chunk :  chunk就是如上所述的属于某个slab class分配出去的固定大小内存。

c.      page: 当一个slab class没有内存可用时,需要向系统申请想的空间,这时候都是依照一个page的大小来申请的。但一个page用完之后,会继续申请新的page以便使用。

d.      如果page也不能申请了(有mem_limit限制),则返回空;此时上层应用可能得通过LRU机制,释放一定空间


Mc(memcache)使用slab机制,也会有一定的问题:虽然内存碎片问题解决了,但是由于分配的内存长度固定,因此无法有效利用分配的内存。例如将110字节的数据,缓存到128字节的chunk中,剩下的18字节就浪费了。。。因此有了调优因子的概念,即-f参数,默认是1.25.

Hash:

程序启动的时候根据配置创建一定大小的hash数组,记录该数组长度(比如2^14),每个数组里面都是一个item的指针。这样当新插入一个item的时候,过程大致如下:

a.      根据item的key的hash值,hash模上数组大小,即该item所在数组位置

b.      如果该位置为NULL,表明之前之前没有item插入,直接插入即可

c.      如果该位置不为NULL,表明之前有item已经插入,则遍历该item的单向链表,直到最后,插在链表最后面

d.      如果现在总的item个数大于数组大小的1.5,则尝试扩展hash表




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章