MemCache解析

MemCache原理

memcache是一个高性能的分布式内存缓存服务器,它的分布式其实在服务端是不具有分布式的特征的,是依靠客户端的分布式算法进行了分布式,memcached是一个纯内存型的数据库,这样在读写速度上相对来说比较快。
memcache采用预先分配原则,这种是空间换时间的方式来提高它的速度,但是不能很高效的利用内存空间,但是memcache采用Slab Allocation机制来解决内存碎片的问题,其原理是按照预先规定的大小,将分配的内存分割成特定长度的快,把尺寸相同的快分成组(chunk组)下图

tomcat-load

memcached会针对客户端发送的数据选择slab并缓存到chunk中,这样就有一个弊端那就是比如要缓存的数据大小是50个字节,如果被分配到如上图88字节的chunk中的时候就造成了33个字节的浪费,虽然在内存中不会存在碎片,但是也造成了内存的浪费,这也是我上面说的拿空间换时间的原因,不过memcached对于分配到的内存不会释放,而是重复利用。默认情况下如下图chunk是1.25倍的增加的。
memcache不会监视缓存是否过期,get的时候会检查缓存是否过期(过期,删除,返回空),这是mem的惰性过期机制,默认情况,mem内部会维护一套LRU算法,当内存满时,会把最近最少使用的数据清楚出去,
所以,提升mem的效率:
        1:根据业务存放的value值来调整chunk的大小,以达到最大效率利用内存
        2:扩大内存,保证所有缓存数据不会被清除出去

mem服务器之间是不能通信的,其分布式完全是依靠客户端的分布式算法来完成数据的分布式存储,分布式算法先算出每个服务器的hash,然后将他们分配的2的32方的圆上,然后根据缓存key的hash来映射到圆上,属于哪个区间,顺时针找到的节点就缓存到该服务器上。

再总结MemCache的特性和限制

上面已经对于MemCache做了一个比较详细的解读,这里再次总结MemCache的限制和特性:

1、MemCache中可以保存的item数据量是没有限制的,只要内存足够

2、MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制

3、Key最大为250个字节,超过该长度无法存储

4、单个item最大数据是1MB,超过1MB的数据不予存储

5、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效

6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作

7、MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序

8、MemCache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效