Memcached 理论篇

Memcached 应用非常广泛的一个开源Cache,它是一个在内存中存储key-value的程序,能够以守护进程的形式运行在服务器上,作为数据库到用户之间的缓存。key-value数据全部存储在内存中,不使用硬盘交换区。

我决心要学习一下Memcached。因为它在内存管理、海量数据存储、分布式算法、异步事件响应、网络编程方面。对它的学习分为三个部分:理论上、用法上、源码实现上。

下面是理论篇。

C/S架构

在存储中存储key-value的进程就是memcached服务器,由C语言实现。对应的,访问memcached服务器数据的程序是memcached客户端,客户端有很多种实现,用不同的语言支持不同的场景。客户端与服务器端一般通过TCP连接通信。
客户端与服务器端通信的数据有两类:一类叫做 text lines,作为操作指令。另一类叫做 unstructured data,这是要存储或访问的数据,之所以叫unstructured ,是因为服务器不考虑数据的格式,只当做字节流


事件处理方式

Memcached使用libevent来响应事件。libevent是处理异步事件的程序库,将epoll、kqueue等事件处理功能封装统一起来。


数据存储方式

Memcached使用slab分配机制来管理内存的利用。
所有cache数据都存在内存中。预先把内存分成各种尺寸的块(chunk),相同尺寸的块是一个组(slab class)。
memcached保持着空闲chunk的列表,然后需要的时候根据到来数据的大小选择最合适大小的chunk。
chunk是预先定义好大小的,所以不会进行切分,因而chunk内部是有小碎片的。
调整growth factor参数可以调整slab class大小的差别梯度。

数据淘汰方式
1、cache中的每条数据有时间戳。当数据被访问t时才查看时间戳,如果超时就淘汰。
2、LRU淘汰


分布式数据存储

memcached可以被轻松的打造成分布式存储系统。主要的分布式计算工作位于memcached的客户端,而memcached服务器可以简单的集群。
1、首先计算hash,使用的是crc32摘要算法
2、然后根据服务器个数求余
3、采用一致性hash算法。(增加服务器个数的扩展性、避免负载的不均衡)

你可能感兴趣的:(Memcached 理论篇)