认识memcached

Memcached是什么?

Memcached是一个开源的、高性能的,具有分布式内存对象的缓存系统,从名称上看Mem就是内存的意思,而Cache就是缓存的意思,它通过在事先规划的内存空间中缓存数据库中的数据,以达到减少数据库的高
并发访问,从而达到提升数据库的访问性能,加速动态应用服务的能力。

Memcached 通过缓存经常被读取的数据库中的数据,当程序需要访问后端数据库获取数据时会优先访问Memcached内存缓存,如果缓存中有数据就直接返回前端服务应用,如果没有数据(没有命中)再转发给后端的数据库服务器,程序
服务取到Memcahced内存缓存中没有的对应数据后,除了返回给用户数据外,还会吧数据在内存中进行缓存,等待下次被访问,从而大大的减轻数据库的压力,提高整个网站架构的响应速度,提升了用户体验。

当程序更新、删除数据库中已有的数据时,会同时发送请求通知Memcached已经缓存过的同一个ID内容的旧数据失效,从而保证
Memcached中的数据和数据库中的数据一致。
当分配给Memcached内存空间用完之后,Memcached自身会使用LRU(Least Recently Used,最近最少使用)加到期失效策略,失效
的数据首先被替换掉,然后是最近未使用的数据被替换掉


为了缓解数据库的高并发压力,我们可以在数据库层配置数据读写分离及读数据库做负载均衡,但是更有效更简单的的策略是
部署Memcache服务作为一个缓存区域,把部分数据库的信息保存在内存中,这样前端的服务能够迅速的读取到原本在数据库中
才能读取到的数据。那么,最重要的就是如何通过memcached服务分担数据库系统的压力,由于单台Memcached的内存容量是有限的,
并且单台也是单点,因此,Memcached也有负载均衡及分布式应用的场景。

【分布式应用1】
Memcached支持分布式,我们在应用服务器程序上改造,就可以更好的支持。例如:可以根据key适当进行有规律的封装,比如以用户
为主的网站来说,每个用户都有UserID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcached服务器上,
以2开头用户的数据保存在第二台Memcahced服务器上,存取数据都先按照UserID来进行相应的转换和存取。
但是这个有缺点,就是需要对UserID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际
业务来进行考虑,或者去想更合适的方法。

【分布式应用2】
在应用服务器上通过程序URL_HASH算法去访问Memcached服务,Memcached服务器的地址池可以简单的配在每个程序里

【分布式应用3】
门户如百度,会通过一个中间件代理负载请求后后端的Cache服务

【分布式应用4】
可以用常见的LVS、haproxy做Cache的负载均衡,和普通的应用服务相比,这里的重点是调度算法,Cache一般会选择url_hash,及一致性哈希算法


Memcached的特性

1、协议简单
Memcached的协议实现比较简单,使用的是基于文本行的协议,能通过telnet直接操作Memcached服务存取数据

2、基于libevent的事件处理
简单的说,libevent是一套利用C开发的程序库,它将BSD系统的kqueue,linux系统的epoll等事件功能封装成一个接口,确保即使服务端的连接数增加也能
发挥很好的性能

3、内置的内存管理管理方式
Memcached有一套自己管理内存的方式,这套管理方式非常高效,所有的数据都保存在Memcached内置的内存中,当存入的数据占满内存空间时,Memcached使用
LRU算法自动删除不使用的缓存数据,即重用过期数据的内存空间。Memcached是为缓存系统设计的,因此,没有考虑数据的容灾问题,和机器内存一样,重启
机器数据将会丢失

4、互不通信的Memcached之间具有分布特征
各个Memcached服务器之间互相不通信,都是独立的存取数据,不共享任何信息。通过对客户端的设计,让Memcached具有分布式,能支持海量缓存和大规模应用


Memcached软件工作原理
Memcached是一套C/S模式架构的软件,在服务器段启动服务守护进程,可以为memcached服务器指定监听的IP地址、端口号、并发连接数以及分配多少内存来处理
客户端的请求的参数
应用程序端通过指定缓存服务器的IP地址和端口,就可以连接memcached服务互相通信。需要被缓存的数据以key/value键值对的形式保存在服务器段预分配的内存
区中,每个被缓存的数据都有唯一的标识key,操作memcached中数据通过这个唯一标识的key进行。缓存到Memcached中的数据仅放置在Memcached服务预分配的内存中,
而非存储在memcached所在的磁盘上,因此存储速度非常快。


Memcached内存管理机制
Memcached利用Slab Alloction机制来分配和管理内存。传统的内存管理方式是:使用完通过malloc分配内存后通过free来回收。这种方式容易产生内存碎片并降低操作系统
对内存的管理效率。Slab Alloction机制不存在这样的问题,它安装预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,
可以重复利用。
Memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块。这种方式有时会造成内存浪费,例如:将200字节的一个数据
存入300字节的一个内存块中,会有100字节被浪费掉,不能被使用。避免浪费内存的办法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的
数据大小相对均匀,这样可以减少内存的浪费。
还有一种办法是,在启动时指定“-f”参数,能在某种程度上控制内存组之间的大小差异。在应用中使用Memcached时,通常不重新设置这个参数,使用默认值1.25进行部署。如果想优化Memcached对
内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获得合适的设置值。


Memcached的删除机制
Memcached不会释放已分配的内存空间,除非添加数据设定过期或内存缓存满了,在数据过期后,客户端不能通过key取出它的值,其存储空间被重新利用。
Memcached使用的是一种Lazy Expiration策略,自己不会监控存入的的kay/value对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期。
这种策略不会再过期检测上浪费cpu资源
Memcached在分配空间时,优先使用已经过期的key/value对空间,当分配的内存空间占满时,Memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,
将其空间分配给新的key/value对。在某些情况下,如果不想使用LRU算法,那么可以通过“-M”参数来启动Memcached,这样,Memcached在内存耗尽时,会返回一个报错信息。

 

posted @ 2016-05-23 23:04  sellsa  阅读(146)  评论(0)    收藏  举报