1.memcache是一个存储key-value的高性能的、分布式的对象缓存系统。
2.memcache虽然被称为“分布式缓存”,但memcache本身不具备分布式功能,memcache集群之间不会通信。
所谓的分布式完全依赖于客户端程序实现。
3.memcache通信模型
(1)应用程序调用memcache客户端的API
(2)API通过路由算法(一致性hash算法),获得memcache服务器
(3)API根据得到的mem服务器,调用通信模块,访问memcache集群
4.memcache实现原理
结构:
(1)memcache将得到的内存空间,分为一组slab(内存片)
(2)每个slab里面有若干个page,每个page默认是1M,如果一个slab占100M内存,那么这个slab应该有100个page
(3)每个page包含一组chunk,chunk是真正存储数据的地方,同一个slab里面的chunk大小是固定的
(4)相同大小的slab被组织在一起,称为slab_class
内存分配:
(1)mem中value存放的位置是由value的大小决定的,value总是会被存放在与chunk大小最接近的slab中(因为一个slab
中的chunk大小是固定的,所以可以认为一个slab只有一种型号,
相邻slab内的chunk基本以1.25为比例进行增长,MemCache启动时可以用-f指定这个比例)
(2)放slab的时候,首slab要申请内存,申请的内存是以page为单位的。所以在放入第一个数据的时候,无论对象大小多少,
都会有1M大小的page被分配给该 slab。
(3)申请到page之后,slab会把page的内存按chunk大小进行切分,切分成一个chunk数组,最后从这个chunk数组中取一个存储数组。
memcache的LRU算法
(1)memcache的LRU算法是针对slab的,而非全局的
(2)在存储数据时,如果slab中没有chunk可用了,memcache会把这个slab中最近最少使用的chunk数据清理掉,放上最
新的数据。
5.mem的特性和限制
(1)MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制
(2)key最大长度为250个字节
(3)单个item的数据最大为1M,超过1M的对象不存储
(4)memcache服务端是不安全的,telnet进去,就能清数据
(5)不能够遍历MemCache中所有的item(已存储的数据单元),因为这个操作的速度相对缓慢且会阻塞其他的操作
(6)memcache的高性能源自两方面的hash
I.客户端通过hash key,得到一个节点
II.服务端通过一个hash算法,拿到数据,返给客户端。
(7)memcache是一个非阻塞,基于事件的服务器程序
(8)memcache增加一个key时,传入expire为0,说明这个key永久有效,即使永久有效,这个key也会在30天后失效