本文将从memcached 使用角度,从客户端,协议,服务器端来简要介绍一下memcached 的特性。
memcached是一个高性能的分布式K-V内存存储系统,其在内存中维护了一张hash表,由于其可以在内存中读取,所以读写速度很快,由于内容存在内存中,断电后会遗失,所以可靠性不如db,现在也有将memcached和BDB结合在一起的,叫做memcacheDB,这里不做讨论。
由于其读写速度快的特性,在服务端的应用中,memcache 多应用于web机器和db层面之间的缓存。
对于memcache来说,它的分布式是在客户端实现的,客户端使用一致性hash的算法,实现memcache的分布式。
一致性hash简要介绍:
对每个memcached服务节点计算其hash值,并按照hash值大小顺序将其顺时针排列在一个圆之上,当有新的key过来存储的时候,计算其hash值,并按照顺时针查找,找到的第一个的hash值大于key的hash值的节点,如果找不到,那就取第一台机器,就将其存储在这个节点之上。这样的好处是,如果增加了一个节点,只有新增的节点和其上一个节点之间的hash值的key的存取会有变化,如下图所示:
这样大大减少了增加机器后对命中率的影响。
但是可能会出现如下情况
这样的话,server1的存的量要远远大于server2存的量(只有server1和server2的中间的hash值的key 才会被存到cache里面),在这里,memcache客户端使用虚拟节点的方式,实现负载均衡。
所谓虚拟节点,就是在这个圆上设置一些点,使得落在这些点区间内的某个key归结到上面两台机器上去,具体做法可以是,对上面两个节点,在名称之后加上#序号,假设我们设置三个虚拟节点,分别就是server1#1 server1#2 server1#3 ,server2#1 server2#2 server2#3,设置之后计算节点的hash值,节点的分布如下图所示
这样我们相当于增加了一些节点,这样的负载就均衡了一些。
以上就是memcache客户端的一些知识。