核心知识点
memcached总的特点:简单、稳定、专注
1.简单的通信协议
a.通信协议:TCP
b.序列化协议:文本的自定义协议
2.丰富的客户端程序:几乎支持所有的网络编程语言
3.高性能的网络通信:Libevent(事件出发的通信协议库)
4.高效的内存管理:固定内存分配(slab_class——》slab——》chunk)
5.互不通信的集群架构
Memcached曾一度是网站分布式缓存的代名词,被大量网站使用。
其简单的设计、优异的性能、互不通信的服务器集群、海量数据可伸缩的架构令网站架构师们趋之若鹜。
Memcached的优异性主要表现在以下几个方面:
(1)简单的通信协议
远程通行设计需要考虑两方面的要素,一是通信协议,选择TCP协议还是UDP协议,抑或是HTTP协议;
一是通信序列化协议,数据传输的两端,必须使用彼此可识别的数据的数据序列化方式才能使通信得以完成,
如XML、JSON等文本序列化协议,抑或是Google Protobuffer等二进制序列化协议。
Memcached使用TCP协议(UDP也支持)通信,其序列化协议则是一套基于文本的自定义协议,
非常简单,以一个命令关键字开头,后面是一组命令操作数。
例如读取一个数据的命令协议是get <key>。Memcached以后,许多NoSQL产品都借鉴了或直接会支持这套协议。
(2)丰富的客户端程序
Memcached通信协议非常简单,只要支持该协议的客户端都可以和Memcached服务器通信,
因此Memcached发展出非常丰富的客户端程序,几乎支持所有的主流的网络编程语言,
例如,Java、C/C++/C#、Perl、Python、PHP、Ruby等,因此在混合使用多种编程的网站,Memcached更是如鱼得水。
(3)高性能的网络通信
Memcached服务端通信模块基于Libevent,一个支持事件出发的网络通信程序库,
Libevent的设计和实现有许多值得改善的地方,但它在稳定的长连接方面的表现却正是Memcached需要的。
(4)高效的内存管理
内存管理中一个令人头疼的问题就是内存碎片管理。操作系统、虚拟机垃圾回收在这方面想了许多方法:压缩、复制等。
Memcached使用了一个非常简单的方法——固定空间分配。
Memcached将内存空间分为一组slab,每个slab里又包含一组chunk,同一个slab里的每个chunk的大小是固定的,
拥有相同大小chunk的slab被组织在一起,叫作slab_class。
存储数据时根据数据的Size大小,寻找一个大于Size的最小chunk将数据写入。
这种内存管理方式避免了内存碎片管理的问题,内存的分配和释放都是以chunk为单位的。
和其它缓存一样,Memcached采用LRU算法释放最近最久未被访问的数据占用的空间,
释放的chunk被标记为未用,等待下一个合适大小的数据写入。
当然这种方式也会带来内存浪费的问题。数据只能存入一个比它大的chunk里,而一个chunk只能存入一个数据,其他内存空间被浪费了。
如果启动参数配置不合理,浪费会更加惊人,发现没有缓存多少数据,内存空间就用尽了。
(5)互不通信的服务器集群架构
如上所说,正是这个特性使得Memcached从JBoss Cache、OSCache等众多分布式缓存产品中脱颖而出,满足网站对海量缓存数据的请求。
而其客户端路由算法一致性hash更成为数据存储伸缩性架构设计的经典范式。
事实上,正是集群内服务器互不通信使得集群可以做到几乎无限制的线性伸缩,这也是目前流行的许多大数据技术的基本架构特点。
虽然近些年许多NoSQL产品层出不穷,在数据持久化、支持复杂数据结构、甚至性能方面有许多产品优于Memcached,
但Memcached由于其简单、稳定、专注的特点,仍然在分布式缓存领域占据着重要的地位。