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

)memcached是一个开源的、高性能的内存的缓存软件,从名称上看mem就是内存的意思,而cache就是缓存的意思。
)memcached通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。

2、memcached在企业集群架构中应用场景

    )作为数据库的前端缓存应用
a、完整缓存(易),静态缓存
例如:商品分类,以及商品信息,可事先放到内存里,然后再对外提供数据访问。这个被称之为预热。用户访问时可以只读取memcached缓存,不读取数据库
b、热点缓存(难)
需要前端WEB程序配合,只缓存热点的数据,即缓存经常被访问的数据。
先预热数据库里的基础数据,然后再动态更新。先读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读到的新数据放入缓存存储。 特殊说明:
)如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其他思想实现,例如:秒杀只是获取资格(JS,NODE.JS),而不是瞬间秒杀到手商品。
)如果数据更新,同时出发缓存更新,防止给用户过期数据。 c、对于持久化缓存存储系统,例如redis,可以替代一部分数据库的存储。一些简单的数据业务,投票,统计,好友关注,商品分类等等 )作为集群的session会话共享存储

3、memcached服务在不同企业业务应用

    a、当web程序需要访问后端数据获取数据时会优先访问memcached内存缓存,如果缓存中有数据就直接获取返回前端服务及用户,如果没有数据(没有命中),在由程序请求后端的数据库服务器,获取到对应的数据后,除了返回给前端服务及用户数据外,还会把数据放到memcached内存中进行缓存,等待下次请求被访问,memcached内存始终是数据库的挡箭牌,从而大大的减轻数据库的访问压力,提高整个网站架构的响应速度,提升了用户体验。
b、当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过的同一个id内容的旧数据失效,从而保证memcache中的数据和数据库中的数据一致。
如果是高并发场合,除了通知memcached过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来,这样可以减少数据库的访问压力,提升memcached中缓存的命中率。
c、有一款数据库插件可以再写入更新数据库后,自动抛给MC缓存起来,自动不cache,类似inotity。

4、memcache分布式集群怎么实现

特殊说明:memcache集群和web服务集群是不一样的,所有memcache的数据总和才是数据库的数据,每台memcached都是部分数据。
a、程序端实现
程序加载所有MC的ip列表,通过对key做hash(一致性哈希)。
b、负载均衡器
通过对key做hash(一致性哈希)。 说明:一致性哈希算法的目的是不但保证每个对象只请求一个对应的服务器,而且当节点宕机缓存服务器的更新重新分配比例降到最低。

5、memcached服务特点及工作原理

a、节点之间相互独立
b、C/S模式架构,c语言编写,总共2000多行。
c、异步i/o模型,使用libevent作为事件通知机制。
d、被缓存的数据以key/value键值形式存在的。
e、全部数据存放于内存中,无持久性存储的设计,重启服务,数据会丢失。
f、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。
g、可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期。
h、memcache内存分配机制是对特定的内存进行分块,再把多个块分为一组。

6、memcached内存管理机制原理

malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
早期的memcached内存管理方式是通过malloc分配的内存,使用完通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢,为了解决上述问题,slab allocator内存分配机制就诞生了。
现在的memcached利用slab allocation机制来分配和管理内存。
slab allocation机制原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块(chunk),再把尺寸相同的内存块(chunk)分成组(chunks slab class),这些内存块不会释放,可以重复利用。

Memcached基础介绍-LMLPHP

memcached服务器中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。当有数据存入时,memcached根据接收到的数据大小,选择最合适数据大小的slab分配一个能存下这个数据的最小内存块(chunk)。
例如:有100字节的一个数据,就会被分配存入下面112字节的一个内存块中,这样就会有12字节被浪费掉,这部分空间不能被使用了,这是slab allocator机制的一个缺点。

Memcached基础介绍-LMLPHP

slab allocator还有重复使用已分配的内存的作用。也就是说,分配到内存不会释放,而是重复利用。
slab allocation的主要术语
page:分配给slab的内存空间,默认是1MB。分配给slab之后根据slab的大小切分成chunk.
chunk:用于缓存数据的内存空间或内存块。
slab class:特定大小的多个chunk的集合或组。

memcached slab allocator内存管理机制缺点

slab allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了

Memcached基础介绍-LMLPHP

避免浪费内存的办法是,预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个memcached服务器中,确保存入的数据大小相对均匀,这样就可以减少内存的浪费。还有一种办法是,在启动时指定"-f"参数,能在某种程度上控制内存组之间的大小差异。在应用中使用memcached时,通常可以不重新设置这个参数,使用默认值1.25进行部署。如果想优化memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获得合适的设置值。
-f<factor> chunk size growth factor(default:1.25)!

使用growth factor对slab allocator内存管理机制调优

memcached在启动时指定growth factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异。默认值为1.。但是,在该选项出现之前,这个因子曾经固定为2,称为“powers of ”策略。这个因子要根据实际情况来调整,越大,各个chunk差别越大。

7、memcached对象删除原理与cache机制

memcached主要的cache机制是LRU(最近最少使用)算法,加上item过期失效。当存数据到memcached中,可以指定该数据在缓存中可以待多久which is forever,or some time in the future。如果memcached的内存不够用来,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。在某些情况下(完整缓存),如果不想使用LRU算法,那么可以通过“-M”参数来启动Memcached,这样,Memcached在内存耗尽时,会返回一个报错信息。
-M return error on memory exhausted(rather than removing items)
05-11 13:25