一、Memcached定义
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
Memcached通过在内存里维护一个同一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频,文件以及数据库检索的结果等。memcached主要用于分担数据库压力,memcached将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
二、Memcache 和Memcached两个名称
memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。
memcache可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,memcached自管理这些HashTable。
使用memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台memcache的内存容量的有限的。
三、Memcached操作流程
1、检查客户端的请求数据是否在Memcached中,如果有,则直接把请求数据返回,不再对数据库进行任何操作,路径操作为1,2,3,7.
2、如果请求的数据不在Memcached中,就去查数据库,把从数据库读取的数据返回给客户端,同时把数据缓存一份到Memcached中(memcached客户端不负责,需要程序明确实现),路径操嘴哦为1,2,4,5,7,6.
3、每次更新数据库的同时更新memcached中的数据,保证一致性。
4、当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
四、Memcached使用场景
1、访问频繁的字典数据
2、大量的hot数据
3、页面缓存
4、频繁的查询条件和结果
5、临时处理的数据
五、Memcached的工作原理
首先Memcached是以守护进程的方式运行于一个或多个服务器中,随时接收客户端的连接操作。
客户端在与memcached服务器建立连接之后,接下来做的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符key,存取操作均通过这个key进行,保存到memcached中的对象实际上是放置到内存中的,并不是保存到cache文件中的,这也是为什么memcached能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
memcache采用了C/S的模式,在server端启动服务进程,在启动时可以指定监听的ip、自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。
memcached 的目前版本是通过C实现,采用了单进程、单线程、异步I/O,基于事件(event_based)的服务方式.使用libevent作为事件通知实现。多个Server可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理。Client端通过指定Server端的ip地址(通过域名应该也可以)。需要缓存的对象或数据是以key->value对的形式保存在Server端。key的值通过hash进行转换,根据hash值把value传递到对应的具体的某个Server上。当需要获取对象数据时,也根据key进行。首先对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求。Client端只需要知道保存hash(key)的值在哪台服务器上就可以了。
memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。
说白了memcache是一种内存缓存技术,是一种缓存手段,要看情况来使用。
对于频繁读取,每次读取重复率高,数据更新频度低的数据,用memcache可以优化你的系统响应速度。
说白了memcache是一种内存缓存技术,是一种缓存手段,要看情况来使用。
对于频繁读取,每次读取重复率高,数据更新频度低的数据,用memcache可以优化你的系统响应速度。
六、内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,因此,重启memcached、重启操作系统就会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题
七、Memcached的内存算法
Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。
八、Memcached的缓存策略
Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内存时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/value对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。
九、Memcached分布式算法
当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。
选择服务器的算法有二种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
1.余数算法
先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
2.散列算法
先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。
十、Memcached不互相通信的分布式(基于客户端的分布式)
memcached尽管是“分布式”缓存服务器,但服务器并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎么进行分布呢?这完全取决于客户端 实现。
十一、Memcached集群搭建原理
Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
十二、Memcached基于libevent的时间处理
libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。