Memcached 分布式缓存服务简介

  数据缓存

  随着信息化在各行各业的普及,应用的种类变得繁多起来,同时应用自身的用户量也在节节攀升,当应用用户量和数据量达到一定数量级后,应用层和数据层的压力就需要架构层面的转移,通常会采用应用层由单机变集群,数据层由单机变集群、分库分表、读写分离等措施。

  现代应用中,缓存是必不可少的架构组件,其分布式在客户端、代理层、应用层、数据层等等位置。如下图的应用架构中,除应用层和数据层之外,引入了数据缓存层,用于分散来自于用户的压力。引入缓存层的目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

在这里插入图片描述

  初识 Memcached

  Memcached是一个高性能的分布式的缓存服务。

  Memcached与Redis类似,从宏观的角度来讲,两者都是用于缓存数据,但从更细的角度去看,两者的差距甚大。与Redis相比,Memcached留给了开发者更多的想象空间。

  主要特点:

  · 协议简单。

   Memcached客户端与服务器通信并不采用复杂的XML等格式,而是基于文本行协议。

  · 基于libevent的事件处理。

   libevent是个程序库,它将各类操作系统的事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。

   Windows:poll、select;

   Linux:epoll;

   BSD:kqueue;

   Solaris:/dev/pool;

  · 内置内存存储处理。

   数据存储方式:Slab Allocation。

   之前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。

   Slab Allocation就是为解决该问题而生的,Slab Allocation按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。同时也带来负面影响,由于分配的是固定长度的内存空间,当缓存数据大小差异较大时,会浪费存储空间。

在这里插入图片描述

   Chunk:用于缓存数据的内存空间。

   Slab Class:相同大小的Chunk形成的组。

   Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab大小切分成Chunk。

   数据过期方式:Lazy Expiration + LRU。

   Memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。此种方式不会进行监视,可以减少CPU的消耗。

  · 基于客户端的Memcached分布式。

   Memcached虽然是分布式缓存服务器,但是服务器端并没有"分布式"功能。其分布式功能完全是由客户端来实现的。

在这里插入图片描述

   主要有以下几种分布式算法:

   根据余数计算分散:

    描述:求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

    缺点:方法简单、数据的分散性也相当优秀。当添加或移除服务器时,缓存重组的代价相当大。

   一致性哈希:

    首先求出Memcached服务器的哈希值,并将其配置到0-2的32次方的圆上,然后利用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一台服务器上。如果超过 232仍然找不到服务器,就会保存到第一台 memcached 服务器上。

在这里插入图片描述

  总结

  近几年,Redis的热度扶摇直上,相比Redis,Memcached好似受到了冷落,但凡是都有存在的道理,Memcached相比Redis来说,支持多核、客户端分布式,在某些业务场景下,也会有其施展的舞台。

  若文中存在错误和不足,欢迎指正!