Java架构师之面试题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Memcached

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

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

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 的时间戳,判断是否过期。

i、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,可以存储或查询任意 的数据。

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

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

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

基于 memcached 的基本原则,可以相当轻松地构建出不同类型的缓存架构。除 了这篇 FAQ,在其他地方很容易找到详细资料的。

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 文件等)相比,有什么优缺点?

首先,local cache 有许多与上面(query cache)相同的问题。local cache 能够利 用的内存容量受到(单台)服务器空闲内存空间的限制。不过,localcache 有一点比 memcached 和 query cache 都要好,那就是它不但可以存储任 意的数据,而且没有网络存取的延迟。

  • local cache 的数据查询更快。考虑把 highly common 的数据放在 local cache 中吧。如果每个页面都需要加载一些数量较少的数据,考虑把它们放在 local cached 吧。
  • 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),等等。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
设计模式 Java API
Java 可扩展 API 设计:打造灵活的应用架构
【4月更文挑战第27天】设计可扩展的 API 是构建灵活、易于维护的应用程序架构的关键。Java 提供了丰富的工具和技术来实现这一目标,使开发者能够构建具有高度可扩展性的应用程序。
37 4
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
12 0
|
2天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
6 0
|
2天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
21 2
|
3天前
|
消息中间件 Java 微服务
Java微服务架构实践指南
Java微服务架构实践指南
13 0
|
5天前
|
Java
三个可能的Java面试题
Java垃圾回收机制自动管理内存,回收无引用对象的内存,确保内存有效利用。多态性允许父类引用操作不同子类对象,如Animal引用可调用Dog的方法。异常处理机制通过try-catch块捕获和处理程序异常,例如尝试执行可能导致ArithmeticException的代码,catch块则负责处理异常。
26 9
|
7天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
12天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
15天前
|
Java
【JAVA面试题】static的作用是什么?详细介绍
【JAVA面试题】static的作用是什么?详细介绍
|
2天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。