Memcached 面试题
1、Memcached 是什么,有什么作用?第 103 页 共 485 页
Memcached 是一个开源的,高性能的内存绶存软件,从名称上看 Mem 就是内存
的意思,而 Cache 就是缓存的意思。Memcached 的作用:通过在事先规划好的
内存空间中临时绶存数据库中的各类数据,以达到减少业务对数据库的直接高并
发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
memcached 服务在企业集群架构中有哪些应用场景?
一、作为数据库的前端缓存应用
a、完整缓存(易),静态缓存
例如:商品分类(京东),以及商品信息,可事先放在内存里,然后再对外提供
数据访问,这种先放到内存,我们称之为预热,(先把数据存缓存中),用户访
问时可以只读取 memcached 缓存,不读取数据库了。
b、执点缓存(难)
需要前端 web 程序配合,只缓存热点的数据,即缓存经常被访问的数据。
先预热数据库里的基础数据,然后在动态更新,选读取缓存,如果缓存里没有对
应的数据,程序再去读取数据库,然后程序把读取的新数据放入缓存存储。
特殊说明 :
如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其它思想实现,
例如:称杀只是获取资格,而不是瞬间秒杀到手商品。
那么什么是获取资格?_
就是在数据库中,把 0 标成 1.就有资格啦。再慢慢的去领取商品订单。
因为秒杀过程太长会占用服务器资源。
如果数据更新,同时触发缓存更新,防止给用户过期数据。
对于持久化缓存存储系统,例如:redis,可以替代一部分数据库的存储,
一些简单的数据业务,投票,统计,好友关注,商品分类等。nosql= not only
sql第 104 页 共 485 页
二、作业集群的 session 会话共享存储。
Memcached 服务在不同企业业务应用场景中的工作流程
当 web 程序需要访问后端数据库获取数据时会优先访问 Memcached 内
存缓存,如果缓存中有数据就直接获取返回前端服务及用户,如果没有数据(没
有命中),在由程序请求后端的数据库服务器,获取到对应的数据后,除了返回
给前端服务及用户数据外,还会把数据放到 Memcached 内存中进行缓存,等
待下次请求被访问,Memcache 内存始终是数据库的挡箭牌,从而大大的减轻
数据库的访问压力,提高整个网站架构的响应速度,提升了用户体验。
当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知
Memcached 已经缓存的同一个 ID 内容的旧数据失效,从而保证 Memcache
中数据和数据库中的数据一致。
如果在高并发场合,除了通知 Memcached 过程的缓存失效外,还会通
过相关机制,使得在用户访问新数据前,通过程序预先把更新过的数据推送到
memcache 中缓存起来,这样可以减少数据库的访问压力,提升 Memcached
中缓存命中率。
数据库插件可以再写入更新数据库后,自动抛给 MC 缓存起来,自身不
Cache.
2、Memcached 服务分布式集群如何实现?
特殊说明:Memcached 集群和 web 服务集群是不一样的,所有 Memcached 的
数据总和才是数据库的数据。每台 Memcached 都是部分数据。
(一台 memcached 的数据,就是一部分 mysql 数据库的数据)
a、程序端实现
程序加载所有 mc 的 ip 列表,通过对 key 做 hash (一致性哈希算法)例如:web1 (key)===>对应 A,B,C,D,E,F,G…..若干台服务器。(通过哈希算法实
现)
b、负载均衡器
通过对 key 做 hash (一致性哈希算法)
一致哈希算法的目的是不但保证每个对象只请求一个对应的服务器,而且当节点
宕机,缓存服务器的更新重新分配比例降到最低。
3、Memcached 服务特点及工作原理是什么?
a、完全基于内存缓存的
b、节点之间相互独立
c、C/S 模式架构,C 语言编写,总共 2000 行代码。
d、异步I/O 模型,使用 libevent 作为事件通知机制。
e、被缓存的数据以 key/value 键值对形式存在的。
f、全部数据存放于内存中,无持久性存储的设计,重启服务器,内存里的数据会
丢失。
g、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用 LRU 算法
删除过期的缓存数据。
h、可以对存储的数据设置过期时间,这样过期后的数据自动被清除,服务本身不
会监控过期,而是在访问的时候查看 key 的时间戳,判断是否过期。
j、memcache 会对设定的内存进行分块,再把块分组,然后再提供服务。
4、简述 Memcached 内存管理机制原理?
早期的 Memcached 内存管理方式是通过 malloc 的分配的内存,使用完后通过
free 来回收内存,这种方式容易产生内存碎片,并降低操作系统对内存的管理效
率。加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比
第 105 页 共 485 页memcached 进程本身还慢,为了解决这个问题,Slab Allocation 内存分配机制
就延生了。
现在 Memcached 利用 Slab Allocation 机制来分配和管理内存。
Slab
Allocation 机制原理是按照预先规定的大小,将分配给 memcached 的内存分割
成特定长度的内存块(chunk),再把尺寸相同的内存块,分成组
(chunks slab class),这些内存块不会释放,可以重复利用。
而且,slab allocator 还有重复使用已分配的内存的目的。 也就是说,分配到的
内存不会释放,而是重复利用。
Slab Allocation 的主要术语
Page
分配给 Slab 的内存空间,默认是 1MB。分配给 Slab 之后根据 slab 的大小切分成
chunk。
Chunk
用于缓存记录的内存空间。
SlabClass
特定大小的 chunk 的组。
集群架构方面的问题