一,理解Memcached的数据存储方式被称为Slab Allocator,其基本方式是:
1,先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。
2,然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。chunk的大小是先有一个基本值,然后根据增长因子(1.25)来增大。
3,slab class : 内存区类别(48byte-1M) , 每个类别有一个slab classId
4, Memcached 里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小去选择一个最合适的slab,然后找到空闲的chunk,把数据放进去。
二,新建Item分配内存的过程
1,快速定位slab classId , 先计算Item的长度
key键长 + flag + suffix (17字节) + value值长 + 结构大小(32字节) 取最小冗余的 slab class
2,按顺序寻找可用的chunk
(1)slot:检查slab回收空间slot里是否有剩余的chunk
delete:delete时标记到slot
exptime: get时检查的过期对象标记到slot
(2)end page ptr:检查page中是否有剩余的chunk
(3)memory:内存还有剩余则开辟新的slab
(4)LRU
三,memcached的数据存储方式的缺点:
由于chunk的大小时预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了
四,理解Memcached的数据过期方式:
(1)Lazy Expiration(延迟/惰性 过期)
Memcached不会监控记录是否过期,而是在外部来获取数据的时候,才检查记录时间戳。因此被称为Lazy Expiration
(2)LRU(Least Recently Used )
当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不够,那么就会把最近最少使用的对象的空间释放出来。 不是全局的,而是针对slab,可以说是区域性的。
(3)懒惰删除机制
删除item对象时,不释放内存,做删除标记,指针放入slot回收插槽,下次分配的时候直接使用。
要特别注意:Memcached的LRU不是全局的,而是针对slab的,可以说是区域性的