面试系列-Memcached面试专题

本文探讨了Memcached的工作原理、优点与MySQL querycache的对比,以及与本地缓存的异同,重点讲解了LRU算法、冗余机制和身份验证缺失。了解Memcached在水平扩展、性能和应用场景中的关键特性。
摘要由CSDN通过智能技术生成

导语
  Memcached 是一套分布式的高速缓存系统。在很多网站被广泛使用。下面就来看一下在面试过程中对于Memcached的相关面试题。

1、Memcached 是怎么工作的?

  Memcached 是使用两端哈希(Two-stage Hash)。Memcached 像是一个存储了很多KV的哈希表,通过Key,可以存储或者查询到任意的数据。

  客户端可以包数据存储在多个Memcached 上。当查询数据的时候,客户端首先参考节列表计算出Key的哈希值(第一阶段Hash),从而选择一个节点;客户端将请求发送给选中的节点,然后Memcached 节点通过一个内部的哈希算法(第二阶段Hash),查找到真正的数据(item)。

  举例子,假设有3个客户端1,2, 3 。3台Memcached A,B,C

   Client 1 想把数据“Helloween” 以 key 为 “hello” 的方式进行存储。Client1 首先参考节点列表(A,B,C),计算Key “hello” 的哈希值,假设Memcached B被选中。接着,Client 1 直接 connect 到Memcached B, 通过 key “hello” 把数据存储到其中。

  Client 2 使用与Client 1 相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的Memcached 列表(A,B,C)。经过相同的哈希计算(阶段一),Client 2 计算的key “hello” 在Memcached B上,然后它直接请求Memcached B,得到数据 “Helloween”。

  各种客户端在Memcached 中的存储形式是不一样的(Perl Storable,PHP Serialize,Java Hibernate,JSON等)。一些客户端 实现的哈希算法也不一样。但是Memcached 服务端的行为总是一致的。

  从实现的角度看,Memcached 是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。

2、Memcached 最大的优势是什么?

  Memcached 最大 的好处就是它带来的水平可扩展性,特别在一个巨大的系统中,由于客户端自己做了一次Hash,那么会很容易增加大量的Memcached到集群中。Memcached 之间没有相互通信 ,所以不会增加Memcached 的负载;没有多播协议,不会网络通信爆炸(implode)。Memcached 的集群很好用,内存不够,增加几台Memcached,CPU不够用,也只需要在增加Memcached 就可以。

3、Memcached 和MySQL 的query cache 相比,有什么优缺点?

  把Memcached 引入应用中,还是需要不少的工作量,MySQL 有个使用方便的query cache ,可以自动地缓存SQL 查询结果,被缓存的SQL查询可以被反复的快速执行。Memcached 与之相比,怎么样?MySQL query cache 的集中式的,连接到该query cache 的MySQL服务器都会受益。

  • 当需要修改表的时候,MySQL 的query cache 会被立刻刷新,存储一个Memcached item 需要的时间很短,但是当写操作频繁的时候,MySQL 的query cache 会经常让所有缓存数据都失效。
  • 在多核CPU上,MySQL的query cache 会遇到扩展问题。在多核CPU上,query cache 会增加一个全局锁,由于需要刷新更多的缓存数据,速度会变慢。
  • 在MySQL的query cache 中,不能存储任意的数据(只能是SQL的查询结果)。而利用Memcached ,可以搭建出各种高效的缓存,例如,可以执行多个独立的查询,创建一个用户对象,然后将用户对象缓存到Memcached中,而query cache是SQL语句级别的,不可能做到这一点,在小网站中,query cache 会有所帮助,但随着网站规模的增加,query cache 的弊端大于利。
  • query cache 能够利用的内存容量受到MySQL服务器空闲内存空间的限制,给数据库服务器增加更多的内存来缓存数据,固然很好,但是有了Memcached,只要有空闲的内存,都可以用来增加Memcached的集群规模,然后就可以缓存更多的数据了。

4、Memcached 和服务器的 local cache相比,有什么优缺点

  首先local cache 有许多与上面query cache 相同的问题。local cache 能够利用的内存容量受到(单台)服务器空闲内存空间的限制。不过local cache 有一点比Memcached 和query cache 都要好,那就是它不但可以存储任意的数据,还没有网络存取的延迟。

  • local cache 的数据查询更快,考虑吧highly common 的数据放在local cache中,如果每个页面都需要加载一些数据量较小的数据,可以考虑将其放入到local cache中。
  • local cache 缺少集体失效(group invalidation)的特性。在Memcached 集群中,删除或者更新一个key的时候会让所有的观察者察觉到。在local cache中,只能通过通知所有服务器刷新 cache的方式,后者仅仅依赖缓存超时失效机制。
  • local cache 面临的是严重的内存限制。

5、Memcached 的Cache机制是怎么样的?

   Memcached 主要的Cache机制是LRU(最近最少用) 算法+超时失效。当存储的数据到Memcached 中,可以指定该数据在缓存中可以呆多久,如果Memcached 的内存不够用了,过期的slabs 会被优先替换,接着就是最老的未被使用的slabs。

6、Memcached 如何实现冗余机制?

  不实现,Memcached 应该是应用缓存层,它的设计本来就是不带有任何冗余机制的,如果一个Memcached 节点失去了所有数据,应该可以从数据源再次获取到数据,需要注意的是,应用应该可以容忍节点的失效。所以不要写一些糟糕的代码,从而寄希望于Memcached来保证一切,如果担心节点失效会增加数据库的负担,那么可以使用其他的办法来进行保证。例如可以增加多个节点,或者是热备份节点等等操作。

7、Memcached 如何容错的?

  不处理,在Memcached 节点失效的情况下,集群没有必要做任何容错机制出来了。如果发生了节点失效,应对的措施完全取决于用户,节点失效的时候,可以通过如下的一些方案来实现:

  • 忽略,在失效节点恢复之前或者被替换之前,还有很多其他节点可以应对节点失效带来的影响。
  • 把失效的节点从节点列表中移除,这个操作千万小心,在默认情况下(余数式哈希算法),客户端添加或者移除节点,会导致所有的缓存数据不可用!因为Hash 参照的节点列表变化了,大部分的Key会因为Hash值的变化而改变到其他映射订的节点上。
  • 启动热备节点,接管失效节点所占用的IP,这样就可以防止哈希紊乱。
  • 如果希望添加或者移除接单,而不影响原来的Hash结果,可以使用一致性Hash算法。
  • 两次Hash,当客户端存取数据的时候,返现一个节点down了,就再做一次哈希,重新选择另一个节点,如果某个节点时好时坏,那么两次Hash也就有风险了,好的节点和坏的节点都可能存在脏数据。

8、如何将Memcached中的Item批量导入导出?

  不允许,Memcached 是一个非阻塞的服务器,任何可能导致Memcached 暂停或者瞬时拒绝服务的操作都是需要经过深思熟虑的,向Memcached 中批量导入数据往往并不是真实的目的,真实的目的是更新数据,如果数据之间出现了变化,那就需要处理脏数据了。如果数据在导入导出之间过期了,那么这些数据又如何进行处理呢?

  所以,批量导入导出并不能正常的保证数据的可用性,但在某些场景中,是比较有用的,如果存在大量的从来都不会变化的数据,并且希望缓存能很快的热起来,批量导入的缓存数据是很有帮助的,虽然这个场景并不是典型的场景,在实际开发的过程中确实比较常见的,所以也是可以用的。

9、Memcached 是如何做身份验证的?

   没有身份验证机制,Memcached 是运行在应用下层的软件。Memcached 客户端和服务端之间是轻量级的,部分原因就是完全没有实现身份验证的机制,这样Memcached可以很快的创建连接,服务端也不需要任何的配置。

10、Memcached 的多线程是什么?如何使用它们?

  线程就是定律,在Memcached1.2 以及更高版本拥有了多线程模式。多线程模式允许Memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据,Memcached 使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个Memcached实例,这种方式能够有效的处理 Mulit gets。

  如果系统的负载并不重,或许不需要启动多线程工作模式,如果有一个庞大的软硬件网站,或许可以使用多线程模式。

  命令解析可以运行在多线程模式下,Memcached 内部对数据的操作是基于全局锁的方式,这部分的工作其实并不是多线程的,所以这部分的内容需要进行优化,提高Memcached 在负载极高的场景下的性能。

11、Memcached 能够接受的Key的最大值?

  key的最大长度是250个字符。需要注意的是250是Memcached服务器端的限制,如果客户端支持key的前缀 或者类似的特性,那么两者之和就会超过250个字符,所以需要推荐使用的就是较短的key。可以节省内存提升效率。

12、Memcached 对item 的过期时间有什么限制?

  最大过期时间可以达到30天,Memcached 把传入的过期时间看做是时间点,一旦到了这个时间点,Memcached就会把item设置成失效状态,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值