标签: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 介绍
原文地址:http://lvnian.blog.51cto.com/7155281/1700055