layout: post
title: "Memcached"
category:
tags: ["读文章"]
{% include JB/setup %}
需要被缓存的对象或数据以key/value对的形式保存在服务器端,每个被缓存的对象或数据都有唯一的标示符key,存取操作通过这个key进行。保存到memcached中的对象或数据放置到内存中,并不会作为文件存储在磁盘上,所以存取速度非常快。
由于没有对这些对象进行持久性存储,因此在服务器端的服务重启之后存储在内存中的这些数据就会消失。而且当存储的容量达到启动时设定的值时,就自动使用LRU算法删除不用的缓存,memcacahed是为缓存而设计的服务器,因此在设计之初没有过多考虑数据的永久性问题。
Memcached利用Slab Allocation机制来分配和管理内存。
传统的内存管理方式是:使用完通过malloc非配的内存后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。
Slab A类location机制不存在这样的问题,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
Memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块。这种方式有时会造成内存浪费,(例如:将一个200字节的数据存入一个300字节的内存块中,会有100字节内存被浪费掉,不能使用)。避免浪费内存的方法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,这样就可以减少对内存的浪费。还有一种方法是,在启动时指定“-f”参数,能在某种程度上控制内存组之间的大小差异。在应用中使用memcached时,通常可以不重新设置这个参数,而用默认值“1.25”进行部署。
缓存一般用来保存一些经常存取的对象或数据,通过缓存来存取对象或数据要比磁盘存取快很多。Memcache是一种内存缓存,把经常存取的对象或数据缓存在内存中,内存中缓存的这些数据通过API的方式被存取,数据就像一张大的HASH表,以key-value对的方式存在。
Memcache通过缓存经常被存取的对象或数据,来减轻数据库的压力,提高网站的响应速度,构建速度更快的可拓展的Web应用。
Memcache和数据库协作的流程:
- 检查客户端的请求的数据是否在Memcached中存在,如果存在,直接把请求的数据返回,不再对数据进行任何操作。
- 如果请求的数据不在Memcache中,就去查询数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到Memcache中。
- 每次更新数据库(如更新、删除数据库的数据)的同时更行Memcache中的数据,保证Memcache中的数据和数据库中的数据一致。
- 当分配给Memcache内存空间用完之后,会使用LRU策略加到期失效策略,失效的数据首先被替换掉,然后在替换掉最近未使用的数据。
Memcached使用一种Lazy Expiration策略,自己不会监控存入的key/value对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期。这种策略不会在过期检测上浪费cpu资源。