memcached的分布式

摘要:
今天,我写了一些周末在火车上看到的Memcached:1.Memcached分布式尽管Memcached被称为“分布式”缓存服务器,但服务器端没有“分布式”功能。Memcached分布式原则:假设有五个Memcached服务器:node1、node2……首先将key1添加到Memcached。在key1传递给客户端程序后,客户端实现的算法将根据密钥“key1”确定memcached服务器保存数据。Memcached服务器的数量增加,密钥变得更加分散。即使服务器发生故障,其他缓存也不会受到影响。

今天写点周末在火车上看的memcached的东西:

一:memcached的分布式

         虽然memcached被称为“分布式”缓存服务器,但是服务器端并没有“分布式”的功能。而是通过客户端来实现的。

         Memcached分布式原理:    

                           假设有5台memcached服务器:node1,node2… node5。现在要保存键为key1,key2…key10的数据。首先往memcached中添加key1。将key1传给客户端程序之后,客户端实现的算法会根据这个键“key1”来决定保存数据的memcached服务器。

                   将服务器选定之后,将会用选定的服务器来保存“key1”和对应的值。

                            在获取数据的时候,通过先根据要获取的数据的key来根据客户端实现的相同的算法选择对应的数据保存的服务器,然后取出数据。

                            这样就实现了memcached的分布式。Memcached的服务器增多,则键就会更加的分散。及时一台服务器挂掉,也不会影响其他的缓存。

Memcached分布式方法:      

  1.根据余数计算

这种方法简单的说就是”根据服务器的台数的余数来进行分散“。首先求取键所对应的整数哈希值,然后根据余数来选择服务器。

这种方法简单高效,而且数据的分散性也非常的好。但是问题是当增加或者删除一台memcached服务器的时候,余数就会发生巨大的变化。这样就没有办法获取和保存时间相应的服务器。从而会极大的降低缓存的命中率。2

  2. 一致性哈希

 

这种方法首先求出memcached服务器的哈希值,然后将它分配到0~2^32的圆上,然后使用同样的办法求出数据的健的哈希值,将其映射到圆上。然后从数据映射的点开始顺时针的查找,将数据保存到查找到的第一台服务器上面。如果超出了2^32仍然没有找到服务器,那么就将数据保存到第一台memcached服务器上面。

这种方法在一定程度上决了在修改memcached服务器数据的时候对缓存命中率的影响。在一致性哈希算法中,只有在这个圆上,从增加服务器的那个点逆时针遇到的第一台服务器之间的健会受到影响。因此一致性哈希最大限度的抑制了键的重新分布。

另外一些一致性哈希算法也采用了虚拟节点的办法。因为使用一般的hash函数的话,服务器的映射地点会分布的可能不太均匀,因此使用虚拟节点的思想,为每一台服务器在圆上分配100~300个点。这样就能够抑制分布不均匀,最大限度的减少服务器增加或者减少的时候缓存的重新分布。

  参考代码:

  

import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;

public class ConsistentHash<T> {

 private final HashFunction hashFunction;
 private final int numberOfReplicas;
 private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();

 public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,
     Collection<T> nodes) {
   this.hashFunction = hashFunction;
   this.numberOfReplicas = numberOfReplicas;

   for (T node : nodes) {
     add(node);
   }
 }

 public void add(T node) {
   for (int i = 0; i < numberOfReplicas; i++) {
     circle.put(hashFunction.hash(node.toString() + i), node);
   }
 }

 public void remove(T node) {
   for (int i = 0; i < numberOfReplicas; i++) {
     circle.remove(hashFunction.hash(node.toString() + i));
   }
 }

 public T get(Object key) {
   if (circle.isEmpty()) {
     return null;
   }
   int hash = hashFunction.hash(key);
   if (!circle.containsKey(hash)) {
     SortedMap<Integer, T> tailMap = circle.tailMap(hash);
     hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
   }
   return circle.get(hash);
 }

}

参考资料:

1.  一个java版本的一致性哈希实例:https://weblogs.java.net/blog/2007/11/27/consistent-hashing

2.  一致性哈希:http://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C

         

免责声明:文章转载自《memcached的分布式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python标准库存储对象(pickle包,cPickle包)VueX 基本使用(vue状态管理)及简单小实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HAProxy安装配置详解

简介 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可...

memcache安装

Window 下安装 Memcached 官网上并未提供 Memcached 的Window平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可: 32位系统 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin.zip 3...

redis中的hash、列表、集合操作

一、hash操作 数据结构:key:{k1:v1, k2:v2, k3:v3} 类似Python中的字典 如:info : {name: lina, age: 22, sex: F} hset key k1 v1 设置/创建(字典) hget key k1 获取key1 中 k1对应的值 批量设置获取 hmset key k2 v2 k3 v3 同时...

基于redis的点赞功能设计

前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等。 直接写入Mysql 直接写入Mysql是最简单的做法。 做两个表即可, post_like 记录文章被赞的次数,已有多少人赞过这种数据就可以...

Redis缓存篇(四)缓存异常

这一节,我们来学习一下缓存异常。缓存异常有四种类型,分别是缓存和数据库的数据不一致、缓存雪崩、缓存击穿和缓存穿透。 下面通过了解这四种缓存异常的原理和应对方法。 缓存和数据库的数据不一致 缓存和数据库的数据一致性包含两种情况: 缓存中有数据,缓存的数据值需要和数据库中的值相同; 缓存中没有数据,数据库中的值必须是最新值。 数据不一致是如何发生的? 在第...

redis缓存策略

常用策略有“求留余数法”和“一致性HASH算法” redis存储的是key,value键值对 一、求留余数法 使用HASH表数据长度对HASHCODE求余数,余数作为索引,使用该余数,直接设置或访问缓存。 计算key的HashCode 缺点:增加服务器,由于除数不一样了,之前缓存的数据都没办法访问了,即不支持热部署【扩展】 二、一致性HASH算法 一致性...