memcached是缓存,所以数据不会永久保存在服务器上,而是保存在服务器内存。它不会释放已经分配的内存,当记录超时后客户端即无法命中该记录,其存储空间即可被重复使用,优先使用过期的记录空间,当空间不足时Least Recently Used(LRU),即“最近很少使用”机制来分配空间。memcached内部不会监视记录是否过期,而是在Get时查看时间戳,这种技术叫“Lazy expiration”,因此它不会在过期监视上花费CPU时间。memcached分布式算法由客户端程序实现,这种分布式是memcached的最大特点。
起初算法:根据余数计算分散。
机制:键值HashCode / 服务器节点数目 =(求余) 服务器位置。当选择的服务器无法连接时,则将连接次数添加到键值后,再计算哈希值并再次尝试(Rehash)连接选择的服务器。
这种方法很好,但是当增删服务器时,缓存的命中率的确很失败,大概降低到23%。web应用中,增删缓存服务器瞬间,缓存效率会急剧下降,负载会突然集中到数据库服务器。于是,新的事物诞生了。
优化后的算法:Consistent Hashing
首先求出memcached服务器节点的哈希值,并将其配置到0~2的32次方的环上,然后用同样的方法求出数据键值的哈希值并映射到环上,然后从数据被映射到环的位置开始顺时针查找服务器位置,将数据保存在第一个找到的服务器上。如果没有找到则保持在第一个服务器上。
在这种算法下,增加服务器只会影响该节点位置逆时针方向的第一台服务器上的键。为了解决服务器节点位置的映射不均问题,并进一步减小增减服务器带来的缓存重分布,引入了“虚拟机点”的思想,即,每个物理节点上分配几百个点。
由服务器台数n,和增加的服务器台数m,计算增加服务器后的命中率计算公式:(1-n/(n+m)) * 100