计算机系统应用教程网站

网站首页 > 技术文章 正文

面试京东实习,如何保障三个数据库的数据一致性?

btikc 2024-11-30 19:06:19 技术文章 50 ℃ 0 评论

大家好呀,我是程序员李寒衣。 今天分享一位同学面试京东go开发的面经。这位同学本身学的语言是java,所以并没有问go相关的问题。总的问题数量不多,主要围绕mysql,redis,java基础这几个部分,其中如何保障三个数据库的数据一致性 比较有意思。

Java

1.Spring里的AOP说一下

首先介绍一下AOP的概念: AOP(Aspect Oriented Programming)即面向切面编程,AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP 的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化(也能实现代码的复用),提高代码的可读性和可维护性。

AOP 为什么叫面向切面编程?

AOP 之所以叫面向切面编程,是因为它的核心思想就是将横切关注点从核心业务逻辑中分离出来,形成一个个的切面(Aspect)

AOP 的应用场景有哪些?(面试官实际想问的是这个,但是前置铺垫也很重要)

  • 事务管理:@Transactional 注解可以让 Spring 为我们进行事务管理比如回滚异常操作,免去了重复的事务管理逻辑。@Transactional注解就是基于 AOP 实现的。
  • 权限控制:利用 AOP 在目标方法执行前判断用户是否具备所需要的权限,如果具备,就执行目标方法,否则就不执行。例如,SpringSecurity 利用@PreAuthorize 注解一行代码即可自定义权限校验

2.说一说反射

先介绍概念什么是反射: 它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

再简单分析下反射的优缺点: 反射可以让我们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利。但是由于无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)存在安全问题。另外性能也稍差,不过,对于框架来说实际是影响不大的。

Redis

1. 实习里项目使用mysql、mongodb、redis都用来干什么

这块根据项目说就行了,一般mysql作为基础的存储组件用来存一些持久化数据,redis用来作分布式锁,或者再流量高峰期存储一些高热数据,作为db的前置屏障,降低db的压力。(这里我只是举个例子,实际以自己的项目为准)

2.项目里有没有遇到redis的持久化,有哪些方式(面试高频题)

这块能够衍生的东西比较多,结合项目回答就是你配置文件里面开启了AOF还是RDB,AOF 持久化方式可以在配置文件中配置,你项目中用的是哪种,为什么使用这种配置,一般会这样问 Redis有两种数据持久化的方式:AOF和RDB。 简单来说,AOF是记录数据增量的方式,将每次对服务器写的操作存入日志(类似MySQL的binlog);而RDB是记录全量数据,根据指定的时间间隔对数据进行快照存储,以二进制格式文件(后缀RDB)保存在硬盘当中。

mysql

1.如何保证三个数据库之间的数据一致性,如服务突然宕机

这应该是这次面试最有难度的一道题了,根据不同的数据不一致问题,有不同的解决方案。

分布式事务

在分布式系统中,由于网络延迟、故障、数据冲突等原因,多个数据源之间的事务执行很可能出现异常导致数据不一致问题。解决这个问题我们可以采用分布式事务,它可以保证所有参与的事务都能得到提交或者回滚。可能继续追问你分布式事务的实现方式,建议去了解一下

定时同步机制 & 使用消息队列

定时任务主要是写一个脚本定时的去更新某些数据,以保障多个数据库的最终一致性。而消息队列则可以通过监听消息的变更从而再去更新消息。

如果涉及多个数据库之间的事务处理,可以使用分布式事务;如果是读写分离的数据同步问题,则可以采用定时同步机制;如果想要实现多个应用程序之间的数据传输与共享,则最好使用消息队列。在各种情况下,我们也可以结合异常处理机制和容错机制,从而达到数据安全、稳定运行和高扩展性的目的。

2.mysql在项目里有没有用到索引,哪些字段用了,哪些字段为什么不用

索引一般是针对数据量较大的场景下,提高查询效率的,适用于查多写少的场景。结合这个去回答就行了,可能还会问mysql索引的底层结构,最左匹配原则之类的问题。

3.mysql索引底层是什么

底层结构是B+树。一般还会问你为啥不是B树或者红黑树,一般从下面这几个方面来回答:

  1. MySQL的数据是存储在硬盘的,在查询时一般是不能 T一次性,把全部数据加载到内存中
  2. B+树是多路搜索树和红黑树(二叉搜索树)相比更加矮壮,在数据不能一次加载至内存的场景下,数据需要被检索出来,多路搜索树更加适合
  3. B+树非叶子节点不存储数据,在相同的数据量下,B+树更加矮壮。 (这个应该不用多解释了,数据都存储在叶子节点上,非叶子节点的存储能存储更多的索引,所以整棵树就更加矮壮)
  4. B+树叶子节点之间组成一个链表方便于遍历查询(遍历操作在MySQL中比较常见) 在MySQL InnoDB引擎下,每创建一个索引,相当于生成了一颗B+树。 如果该索引是 [聚集(聚簇)索引],那当前B+树的叶子节点存储着主键和当前行的数据

计算机网络

1.计算机网络的四次挥手过程说一下,如果没有第四次挥手会怎么样

面试常客,但是容易背了忘,忘了背,以下是我找的比较好的一个回答

断开一个 TCP 连接则需要“四次挥手”,缺一不可:

  1. 第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手:服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
  4. 第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

为什么要四次挥手?

TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

举个例子:A 和 B 打电话,通话即将结束后。

  1. 第一次挥手:A 说“我没啥要说的了”
  2. 第二次挥手:B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
  3. 第三次挥手:于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
  4. 第四次挥手:A 回答“知道了”,这样通话才算结束。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表