Memcached分布式缓存

memcached是一款高性能的分布式内存缓存服务器,一般目的是为了通过缓存数据库的查询命中减少数据库压力、提高应用响应速度、提高可扩展性。

memcached缓存特点

  1. 协议简单
  2. 基于libevent的事件处理
  3. 内置内存存储方式
  4. memcached不相互通信的分布式

Memcached分布式缓存_第1张图片
使用键值对存储,使用get put等方法。
Memcached分布式缓存_第2张图片
实现memcached有很多种方式,其中最常用的就是一致哈希思想****Consistent Hashing的分布式

还有一种取模算法方式分布式

何为取模算法方式分布式?就是将key转换为32位的数字,并与memcached服务器的总数进行相除取得余数。而这个余数就是memcached服务器的节点node。有了这个node我们就可以确定memcached服务器,就可以发送命令给memcached执行了。
Memcached分布式缓存_第3张图片

一致哈希算法方式分布式
何为一致哈希算法方式分布式呢?

想象一下,将32位的所有数字从小到大按顺时针分布在一个圆环上,该圆环叫值域;
  
  其次,将每个存储节点赋予一个名字,并通过crc32函数将其转换为32位的数字,此数字就是该memcached服务器的存储节点

接着,将key也通过crc32函数转换为32位的数字,将其对应到圆环上,它的所在位置按顺时针方向走第一个遇到的存储节点所对应的memcached服务器就是该key的最终存储服务器。
  Memcached分布式缓存_第4张图片Memcached分布式缓存_第5张图片
  使用这个方式,在扩容的时候只有较少部分受影响。
  Memcached分布式缓存_第6张图片
但是这种方式会存在一个缺点,就是使用crc32函数我们不能控制memcached存储节点的具体位置,可能会出现下列情况:
Memcached分布式缓存_第7张图片
我们的解决办法是:
 将一个真实存储节点映射为多个虚拟存储节点,即真实节点+后缀再通过crc32处理(例如:node1_1、node1_2、node1_3、……、node1_n)

看下图节点分布: 三个真实节点在圆环上就变成了三十个存储节点,这样就可以避免存储节点相距太近而导致数据缓存分布不均匀的问题了,而且存储机制没有任何变化。
Memcached分布式缓存_第8张图片

一致性哈希分布式的优点: 
 相对于取模方式分布式,一致性哈希方式分布式的代码复杂性要高一点,但这也在可以接受的范围内,不构成任何阻碍问题。相反它的优点就非常显著,通过虚拟节点的方式实现,可以使不可控的存储节点能够尽可能的均匀分布在圆环上,从而达到数据均匀缓存在各个主机里。其次增加与删除虚拟节点对于之前缓存的整体数据影响非常小

转自:https://www.cnblogs.com/phpstudy2015-6/p/6713164.html

你可能感兴趣的:(Java)