memcached介绍

Memcached是开源的分布式cache系统,通常与web架构集成,可以认为是“数据库在内存中的缓存”(高性能分布式内存缓存服务器),数据请求首先查看位于内存的cache系统,在没有找到数据的情况下才会请求数据库。应用程序在提高了性能的同时,还大大降低了数据库的负载。
Memcached有两个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中,mc先通过计算key的hash值来确定kv对所处在的ms位置。当ms确定后,客户端就会发送一个查询请求给对应的ms,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的。

memcached为key->value非关系型数据库,key为一般字串,值唯一。value除了php中的资源不能存,其它的数据都能存储(字符串、数值、数组、对象、布尔值、null、二进制<图片、视频>),但是都以字符串的形式存储。

memcached特征:

1、协议简单(文本行协议)
2、基于libevent事件处理(注:libevent是一个程序库,封装了linux的epoll、BSD类操作系统的kqueue等事件处理功能。即使对服务器的连接数添加,也能发挥O(1)的性能。memcached在linux、BSD等操作系统上能发挥其高性能。)
3、内置内存存储方式(存储在memcached内置的内存存储空间中,提高性能。 问题:memcached重启或操作系统重启数据会丢失,达到一定量后会启动算法自动删除不使用的缓存)
4、不互相通信的分布式(不互相通信共享信息。)

memcached适合做的东西:

1、访问频繁的字典数据
2、大量的hot数据(热门数据缓存)
3、页面缓存(web站常用)
4、搜索的查询条件和结果(热门搜索的内容缓存起来)
5、临时处理数据(不需要入库,排重)

memcache工作原理:

memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。
采用的是C/S模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。以key->value形式,key 的值通过 hash 进行转换,然后确定对那台sever存储/获取数据。

memcache内存算法:

使用的是slab allocation机制分配和管理内存,按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。

memcached缓存策略:

Lazy expiration + LRU:加载到memcached中的数据都有有效期,memcache会优先使用已超时的空间(memcached不会在过期监视上耗费过多的CPU时间),当空间不足时候,采用Least Recently Used(LRU)替换算法腾出空间。

memcached分布式算法:

当向memcached集群存入/取出key/value时,memcached客户端会根据一定算法计算出对应的服务器。(第一步:选择服务器,第二步:存取数据)
余数算法:先求得键的整数散列值,再除以服务器数量,根据余数觉得存储那台服务器。(特点:简单、高效。但是扩展性差,服务器数量变更时,几乎所有的缓存都会失效)
散列算法:先计算memcached 服务器的散列值,将其分布在0—2^32-1的圆上;用同样的方法算出object key的散列值并映射至圆上,然后从object key的位置顺时针查找,找到的第一台服务器后将object存在该服务器上。如果添加一台memcached服务器,则新添加的服务器的顺时针的第一台服务器上会受到影响。