码迷,mamicode.com
首页 > 系统相关 > 详细

memcached 介绍

时间:2015-10-04 06:47:51      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:memcached 介绍

memcache 是一套数据缓存系统或者软件

用于在动态应用系统中缓存数据库中的数据,减少数据库的访问压力,达到提升系统性能的目的。


memcache在企业应用场景中一般只是用来做数据库的cache服务使用。

memcache是通过预先分配指定内存空间来缓存数据的,因此它比MYSQL这样数据库直接操作硬盘要快很多,可以提供比直接读取数据库更好的性能,另外,memcached也进程作为集群节点应用服务器直接session数据共享的存储


软件                         作业                           缓存数据

memcached、redies        后端数据库缓存            动态的数据,如:博文、bbs帖子

squid、nginx、varnish    前端web应用的缓存         静态数据缓存,如:图片、附件、js、html、css   


网站的瓶颈,数据库和存储,对于数据库的减压有memcached、redis等nosql数据库。对于存储的减压有nginx、squid、varnish、CDN


#############################################################################

#############################################################################

1、Memcached是什么,有什么作用?


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


memcached是服务端主程序名,memcached服务一般被用来保存网络中经常被读取的对象或数据,就像我们客户端浏览器也会把经常访问网页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的介质。


#############################################################################

#############################################################################

2、Memcached服务在企业集群架构中应用角色


  1、作为数据库的前端缓存应用

     a、可以减少数据库的压力

    这个是比较重要的,所有的完整动态数据都保存在数据库中,每次频繁的读取数据库,会导致数据库性能的急速下降,无法同时服务更多的用户,比如mysql特别频繁的锁表,那么,就可以让memcached来分担数据库的压力,增加memcached服务的好处除了可以分担数据库的压力,增加memcached架构也无需改动整个网站的架构,只需要修改程序首先来读取memcached查询的数据就可以了。当然别忘记,更新数据库时也要更新缓存

   2、sesson 会话共享的共享存储

      默认情况下,session会话保存在/tmp目录下,由php的配置文件php.ini中指定。

   




3、Memcached服务在不同企业业务应用场景中的工作流程


memcached是一种内存缓存,在工作中经常用来缓存数据库中的数据,数据被缓存在事先预分配的memcached管理的内存中,可以通过API的方式存取内存中缓存的这些数据,memcached服务内存中缓存的数据就像一张巨大的hash表,每条数据都是以KEY-value对的形式存在


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


当程序更新。删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过同一个ID内容的数据失效。从而保证memcached中的数据和数据库中的数据一致。


如果是高并发场合,除了通知memcached过期的缓存失效外,还会通知相关机制,使得在用户访问数据库前,通过程序预先把更新的数据推送到们memcached中缓存起来,这样就可以减少数据库的访问压力,提升么么memcached中缓存的命中率


1、程序首先检查前端应用程序服务请求的数据是否在memcached缓存中存在们如果存在,直接把请求的数据返回,不在请求后端的数据库

2、如果请求的数据不在memcached缓存中,请求将被转发去查询数据库服务,把从数据库中取到的数据返回前端服务器应用,同时把新取到的数据新缓存一份到memcached缓存中

3、当程序更新或者删除数据库中已有的数据的同时,也会更新memcached中的就数据,从而保证memcached中缓存的数据和数据库中的数据是一致的,这个一致性非常重要

4、当分配给memcache内存空间用完之后,memcahced自身会使用LRU(least recently used,最近最少使用)

加到期失效策略,失效的数据将首先被替换掉,然后是最近最少使用的数据被替换





4、Memcached服务分布式集群如何实现?


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


分布式应用场景1

memcached支持分布式,我们在应用服务器上稍加改造,就可以更好的支持,例如:我们的KEY可以适当进行有规律的封装,比如以用户为主的网站来说,每个用户都要userID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台memcached服务器,2开头的用户的数据保存在第二台memcached服务器上,存取数据都先安装userID来进行转换和存取


但是这个有缺点,就是需要对userID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法

############################

分布式应用场景2

在应用服务器上通过程序及URL_HASH 算法去访问memcached服务,memcached服务的地址池可以简单配置在每个程序里

############################

分布式应用场景3

门户如百度,会通过一个中间件代理负载请求后端的cache服务

############################

分布式应用场景4

可以用常见的LVS,haproxy做cache的负载均衡,和普通应用服务相比,这里的重点是轮询算法。一般会选择url_hash或者一致性哈希算法


========================================

5、Memcached服务特点及工作原理是什么?


memcached 作为高并发,高性能的缓存服务,具有如下特征

A、协议简单

memcached的协议实现比较简单,使用的是基于文本行的协议,能通过telnet直接超值memcached服务存取数据

B、基于libevent 的事件处理

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

memcached就是利用这个库进行异步事件处理。

所有安装memcached前要安装 libevent库

C、内置的内存管理方式

   memcached有一套自己管理内存的方式,这套管理方式非常高效,所有的数据库都保存在memcached内置的内存中,当存入的数据占满了内存空间时,memcached使用URL算法自动删除最近不常使用的缓存,即重用过期数据的内存空间,memcached是为缓存系统设计的,因此,没有考虑数据的容灾问题。和机器的内存一样,重启机器,数据就会丢失,如果希望重启数据依旧能保留数据,那么就需要sina开发的memcachedb持久化内存缓存系统,当然也可以 用redis。内存缓存:

   

D、memcached相互之间是互不通信的。但具有下面分布式特点

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


###############################################################

###############################################################

###############################################################


6、简述Memcached内存管理机制原理?


Memcached利用slab allocation 机制来分配和管理内存。传统的内存管理方式是:

使用通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率,slab allocation机制不存在这样的问题,他按照预先规定的大小,将分配的内存分割成特点大小的内存块,再把尺寸相同的内存块分成组,这些内存块不会被释放,可以被重新利用

memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块,这种方式有时候会造成内存浪费。如:将一个200字节的数据存入300字节的内存块中,会有100字节被浪费掉,不能被使用,避免浪费内存的方法是,预先计算出应用存入的数据大小,把同一业务类型的数据存入到一个memcached服务器中,确保存入的数据大小均匀,这样就可以减少内存的浪费。

还有一种方法是,在启动是指点“-f” 参数,能在某种程度上控制内存组直接的大小差异,在应用中使用memcached时,通常可以不重新设置这个参数,这个参数的默认值是1.25,如果想优化memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个 参数来获取更加合适的设置值





                      特定长度的内存块               相同大小的内存块组成组

slab allocation 把内存======================>内存块========================>内存组

内存块不会被释放






###############################################################

###############################################################

###############################################################


7、Memcached的删除原理与删除机制?


memcached不会释放已经分配的内存空间,在数据过去后,客户端不能通过key取出它的值,其他存储空间被重新利用

memcached 使用的是一种lazy expiration策略, 自己不会监控存入的key/value对是否过期, 而是在获取key值时对查看记录的时间戳(set key flag exptime bytes ),检查key/value对空间是否过期,这种策略不会再过期检测上浪费CPU资源

memcached在分配空间时,优先使用已经过期的key/value对空间,当分配的内存空间占满时,memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,将其空间分配给新的key/value对。在某种情况下,如果不想使用LRU算法,那么可以通过设置 -M 参数来启动memcached,这样memcached在内存耗尽的时候会返回一个报错的信息


注意:memcached不会设置自动释放内存块,除非你设置了key/value值的过期时间,或者在磁盘满的时候,你设置了LRU算法,如果这两个你都不设置,那么memcached就会在内存消耗尽的时候返回一个报错信息


###############################################################

###############################################################


本文出自 “奋斗吧” 博客,请务必保留此出处http://lvnian.blog.51cto.com/7155281/1700055

memcached 介绍

标签:memcached 介绍

原文地址:http://lvnian.blog.51cto.com/7155281/1700055

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!