两个通宵熬出来的互联网大厂最新面试题收集整理1000道(三-Memcached),欢迎点赞收藏!!!

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

memcached 服务在企业集群架构中有哪些应用场景?

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

a、完整缓存( 易), 静态缓存

例如: 商品分类( 京东), 以及商品信息, 可事先放在内存里, 然后再对外提供数据访问, 这种先放到内存, 我们称之为预热,( 先把数据存缓存中), 用户访问时可以只读取 memcached 缓存, 不读取数据库了。

b、执点缓存( 难)

需要前端 web 程序配合, 只缓存热点的数据, 即缓存经常被访问的数据。先预热数据库里的基础数据, 然后在动态更新, 选读取缓存, 如果缓存里没有对应的数据, 程序再去读取数据库, 然后程序把读取的新数据放入缓存存储。

特殊说明 :

如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其它思想实现, 例如:称杀只是获取资格,而不是瞬间秒杀到手商品。

那么什么是获取资格?

就是在数据库中,把 0 标成 1.就有资格啦。再慢慢的去领取商品订单。因为秒杀过程太长会占用服务器资源。

如果数据更新,同时触发缓存更新,防止给用户过期数据。对于持久化缓存存储系统,例如:redis,可以替代一部分数据库的存储, 一些简单的数据业务,投票,统计,好友关注,商品分类等。nosql= not only sql

二、作业集群的 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 来回收内存, 这种方式容易产生内存碎片, 并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担, 最坏的情况下, 会导致操作系统比

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 的组。

5、memcached 是怎么工作的?


Memcached 的神奇来自两阶段哈希( two-stage hash)。Memcached 就像一个巨大的、存储了很多<key,value>对的哈希表。通过 key,可以存储或查询任意的数据。

客户端可以把数据存储在多台 memcached 上。当查询数据时, 客户端首先参考节点列表计算出 key 的哈希值( 阶段一哈希), 进而选中一个节点; 客户端将请求发送给选中的节点, 然后 memcached 节点通过一个内部的哈希算法( 阶段二哈希), 查找真正的数据( item)。

6、memcached 最大的优势是什么?


Memcached 最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希, 那么我们很容易增加大量 memcached 到集群中。memcached 之间没有相互通信,因此不会增加 memcached 的负载; 没有多播协议, 不会网络通信量爆炸( implode)。memcached 的集群很好用。内存不够了? 增加几台 memcached 吧; CPU 不够用了? 再增加几台吧; 有多余的内存? 在增加几台吧, 不要浪费了。

7、memcached 和MySQL 的query


cache 相比, 有什么优缺点?

把 memcached 引入应用中, 还是需要不少工作量的。MySQL 有个使用方便的query cache, 可以自动地缓存 SQL 查询的结果, 被缓存的 SQL 查询可以被反复地快速执行。Memcached 与之相比,怎么样呢? MySQL 的 query cache 是集中式的, 连接到该query cache 的 MySQL 服务器都会受益。

当您修改表时,MySQL 的query cache 会立刻被刷新(flush)。存储一个 memcached item 只需要很少的时间,但是当写操作很频繁时,MySQL 的query cache 会经常让所有缓存数据都失效。

在多核 CPU 上,MySQL 的 query cache 会遇到扩展问题(scalability issues)。在多核CPU 上,query cache 会增加一个全局锁(global lock), 由于需要刷新更多的缓存数据,速度会变得更慢。

在 MySQL 的query cache 中,我们是不能存储任意的数据的(只能是SQL 查询结果)。而利用 memcached,我们可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到 memcached 中。而query cache 是SQL 语句级别的,不可能做到这一点。在小的网站中,query cache 会有所帮助,但随着网站规模的增加, query cache 的弊将大于利。

query cache 能够利用的内存容量受到MySQL 服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了memcached,只要您有空闲的内存,都可以用来增加memcached 集群的规模,然后您就可以缓存更多的数据。

8、memcached 和服务器的local cache(比如 PHP 的APC、mmap 文件等)相比,有什么优缺点?


首先, localcache 有许多与上面(query cache)相同的问题。localcache 能够利用的内存容量受到( 单台) 服务器空闲内存空间的限制。不过 localcache 有一点比 memcached 和 query cache 都要好, 那就是它不但可以存储任意的数据, 而且没有网络存取的延迟。local cache 的数据查询更快。考虑把highly common 的数据放在local cache 中吧。如果每个页面都需要加载一些数量较少的数据,考虑把它们放在localcached 吧。local cache 缺少集体失效(groupinvalidation)的特性。在memcached 集群中,删除或更新一个key 会让所有的观察者觉察到。但是在local cache 中, 我们只能通知所有的服务器刷新cache(很慢,不具扩展性),或者仅仅依赖缓存超时失效机制。local cache 面临着严重的内存限制,这一点上面已经提到。

9、memcached 的cache 机制是怎样的?


Memcached 主要的 cache 机制是 LRU( 最近最少用) 算法+超时失效。当您存数据到memcached 中, 可以指定该数据在缓存中可以呆多久 Which is forever, or some time in the future。如果 memcached 的内存不够用了, 过期的 slabs 会优先被替换, 接着就轮到最老的未被使用的 slabs。

10、memcached 如何实现冗余机制?


不实现!我们对这个问题感到很惊讶。Memcached 应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个 memcached 节点失去了所有数据, 您应该可以从数据源( 比如数据库) 再次获取到数据。您应该特别注意, 您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码, 寄希望于 memcached来保证一切! 如果您担心节点失效会大大加重数据库的负担, 那么您可以采取一些办法。比如您可以增加更多的节点( 来减少丢失一个节点的影响), 热备节点

( 在其他节点 down 了的时候接管 IP), 等等。

11、memcached 如何处理容错的?


不处理! 在 memcached 节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效, 应对的措施完全取决于用户。节点失效时, 下面列出几种方案供您选择:

  1. 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。

  2. 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用! 因为哈希参照的节点列表变化了,大部分 key 会因为哈希值的改变而被映射到(与原来)不同的节点上。

  3. 启动热备节点,接管失效节点所占用的 IP。这样可以防止哈希紊乱(hashing chaos)。

  4. 如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing)。您可以百度一下一致性哈希算法。支持一致性哈希的客户端已经很成熟,而且被广泛使用。去尝试一下吧!

  5. 两次哈希(reshing)。当客户端存取数据时,如果发现一个节点 down 了,就再做一次哈希(哈希算法与前一次不同),重新选择另一个节点(需要注意的时,客户端并没有把 down 的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据(stale data)。

12、如何将 memcached 中 item 批量导入导出?


您不应该这样做! Memcached 是一个非阻塞的服务器。任何可能导致memcached 暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向 memcached 中批量导入数据往往不是您真正想要的! 想象看, 如果缓存数据在导出导入之间发生了变化, 您就需要处理脏数据了;

13、如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?


因此, 批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有

用。如果您有大量的从不变化的数据, 并且希望缓存很快热( warm) 起来, 批量导入缓存数据是很有帮助的。虽然这个场景并不典型, 但却经常发生, 因此我们会考虑在将来实现批量导出导入的功能。

如果一个 memcached 节点 down 了让您很痛苦,那么您还会陷入其他很多麻烦。您的系统太脆弱了。您需要做一些优化工作。比如处理” 惊群” 问题( 比如memcached 节点都失效了,反复的查询让您的数据库不堪重负… 这个问题在 FAQ 的其他提到过), 或者优化不好的查询。记住, Memcached 并不是您逃避优化查询的借口。

14、memcached 是如何做身份验证的?


没有身份认证机制!memcached 是运行在应用下层的软件( 身份验证应该是应用上层的职责)。memcached 的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached 可以很快地创建新连接,服务器端也无需任何配置。

如果您希望限制访问,您可以使用防火墙,或者让 memcached 监听 unix domain socket。

15、memcached 的多线程是什么?如何使用它们?


最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。**

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-EozmFfFa-1713675077501)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值