Java中间件-Memcached

一、知识结构及面试题目分析

缓存技术的大规模使用是互联网架构区别于传统 IT 技术最大的地方,是整体高并发高性能架构设计中是重中之重的关键一笔,也是互联网公司比较偏好的面试题目。按照在软件系统中所处位置的不同,缓存大体可以分为三类:客户端缓存、服务端缓存、网络中的缓存;根据部署方式大体可分为:本地缓存和分布式缓存。专栏将以分布式缓存为重点,挑选其中应用最广的 memcached、redis 分别予以介绍,同时兼顾其他缓存方案,从部署、设计、应用场景等方面展开。

二、典型面试例题及思路分析

问题 1:memchaced 中的一致性哈希算法是怎样工作的?

在计算一致性哈希时采用一般采用如下步骤:

(1) 首先求出 memcached 服务器(节点)的哈希值,并将其配置到 0~2^32-1 的圆上。

(2) 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。

(3)然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过 2^32-1 仍然找不到服务器,就会保存到第一台 memcached 服务器上。

点评:

传统的哈希算法最常见的是哈希取模算法,即集群中可用机器节点数量为 N,那么 key 值为 K 的的数据请求会路由到 hash (K) mod N 对应的节点。这种算法简单,但并不适用于分布式系统。在分布式系统中,每个节点都可能失效,且节点会随时动态增减,如果用 hash 取模算法,会导致节点增减时的大量缓存无法命中,瞬间穿透缓存,给下游 DB 等系统带来极高的负载,甚至引起宕机。

在分布式缓存中,判定哈希算法好坏有三个标准:

(1)平衡性 (Balance):指哈希的结果能够尽可能分布到所有的缓存中去,尽可能地利用缓存机器;

(2)单调性 (Monotonicity):是哈希的结果尽可能地保证原有已分配的内容可以被映射到原有缓存中去,避免在节点增减过程中导致不能命中;

(3)分散性 (Spread):是指同一个哈希结果,应尽量存储在同一个缓存机器,以提升系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散 性。

相较于哈希取模算法,一致性哈希能比较好地解决单调性(Monotonicity)和分散性 (Spread) 等问题,我们将上一致性哈希的计算步骤更细化一下:

(1)服务器初始化。

整个哈希值空间虚拟成一个有 2^32 节点的圆环,并按顺时针方向组织。假设有 Node A、Node B、Node C、Node D 四台服务器,计算得到各服务器的哈希值(通常使用 ip 或主机名作为关键字进行哈希),分布如下:

假设有四个数据对象 Object A、Object B、Object C、Object D,** 计算得到其哈希值,并映射到上述虚拟圆环的节点上,根据一致性哈希算法,从此位置出发沿环顺时针 “行走”,第一台遇到的服务器就是其应该定位到的服务器。** 在这里,Object A 会存储到 Node A 上,Object B 会存储到 Node B 上,Object C 会存储到 Node C 上,Object D 会存储到 Node D 上。

(3)单调性分析

假设在 Node B 和 Node C 之间新增一个 Node X,可以看到 Object C 被重定位到 Node X,而其余的三个数据对象 Object A/Object B/Object D 都不会有影响。在一致性哈希算法中,如果集群中增加或减少一台服务器,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据不会受到影响,因此具有较好的容错性和可扩展性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值