java面试Day15

1.MVCC 是什么?InnoDB 是如何实现 MVCC 机制的?

MVCC

MVCC指的是多版本并发控制,是指维护一条记录的多个版本,使得读写操作没有冲突。

MVCC的实现

InnoDB对于MVCC的实现,我主要从下面几个点来讲:

  1. 当前读和快照读的概念

  2. MySQL数据的隐藏字段

  3. undo 日志中的版本链

  4. readView(读视图)

  5. MVCC实现流程

当前读与快照读

当前读:就是读取的记录总是最新的,实现的原理就是对正在读的记录加锁,使得读写互斥,这样保证每次读取的都是数据库中最新的记录 快照读:每次读取的时候不一定是最新的数据,而是这条记录的快照版本,这样可以保证读写不互斥,能够并发执行

MySQL的隐藏字段

MVCC的实现主要依赖于:MySQL的隐藏字段、undo log中的版本链、readView MySQL中每条记录是有两个隐藏的字段,分别是:

  • 最近修改事务ID:记录着上一次修改该条记录的日志id

  • 回滚指针:指向上一个版本的记录的地址 另外,如果表中没有指定主键,那么还有有一个隐藏的主键

undo log 版本链

版本链顾名思义就是记录的版本的链表。当事务并发执行修改某条记录的时候,不同的事物对这条数据的修改产生多个版本,每次修改之前都会记录下这条记录之前的数据,在隐藏字段中设置上本次操作事务的ID,并让回滚指针指向上一个版本,这样就会形成一条链表,就锁所谓的版本链。

readView 读视图

readView读视图记录并维护了当前系统活跃的事务ID,为快照读时MVCC提供数据的依据。其主要有以下几个属性:

  • 记录当前活跃事务的ID集合

  • 最小活跃事务ID

  • 预分配事务ID,就是最大活跃事务ID+1(因为事务ID是自增的)

  • readView创建者的事务ID

MVCC执行的流程

当并发事务执行的时候,执行查询操作的时候,会根据这个事务的ID和readView中的事务ID进行一些比较来确定读取哪个版本的快照记录,具体的规则为:

  1. 记录中的最近修改事务的ID小于读视图中的最小事务ID,说明记录的修改已经提交了,可以访问

  2. 事务ID等于读视图中创建者ID,说明这条记录就是当前事务修改的,可以访问

  3. 事务ID大于等于读视图中预分配事务ID,说明这条记录是在读视图创建之后修改的,不可访问当前版本,去访问下一个版本吧

  4. 如果事务ID在最小事务ID和最大ID之间且不在ID集合中,说明当前版本的修改事务已经提交,可以访问

RC和RR的区别

RC级别时,在一个事务中,每执行一次查询都会生成一次读视图 RR级别时,在一个事务中,只有第一次查询会生成一个读视图,后面的查询都是复用这个读视图,保证了可重复读

2.Redis 的持久化机制有哪些?说说各自的优缺点和应用场景?

Redis 的持久化机制主要分为 RDB 和 AOF 两种。

RDB 持久化机制

RDB 持久化机制是指将 Redis 在内存中的数据以快照的形式写入磁盘中,可以手动或自动执行快照操作,将数据集的状态保存到一个 RDB 文件中。

RDB 机制的优点在于:

  • RDB 机制适合在数据集比较大时进行备份操作,因为它可以生成一个非常紧凑、经过压缩的数据文件,对于备份、恢复、迁移数据都很方便。

  • RDB 机制在 Redis 重启时比 AOF 机制更快地将 Redis 恢复到内存中。

RDB 机制的缺点在于:

  • RDB 机制可能会出现数据丢失,因为数据是周期性地进行备份,一旦 Redis 出现问题并且上一次备份之后还没有进行过数据变更,那么这部分数据将会丢失。

  • RDB 机制会造成一定的 IO 压力,当数据集比较大时,进行备份操作可能会阻塞 Redis 服务器进程。

AOF 持久化机制

AOF 持久化机制是指将 Redis 在内存中的操作命令以追加的形式写入到磁盘中的 AOF 文件,AOF 文件记录了 Redis 在内存中的操作过程,只要在 Redis 重启后重新执行 AOF 文件中的操作命令即可将数据恢复到内存中。

AOF 机制的优点在于:

  • AOF 机制比 RDB 机制更加可靠,因为 AOF 文件记录了 Redis 执行的所有操作命令,可以确保数据不丢失。

  • AOF 机制在恢复大数据集时更加稳健,因为 AOF 文件记录了数据的操作过程,可以确保每一次操作都被正确地执行。

AOF 机制的缺点在于:

  • AOF 机制生成的 AOF 文件比 RDB 文件更大,当数据集比较大时,AOF 文件会比 RDB 文件占用更多的磁盘空间。

  • AOF 机制对于数据恢复的时间比 RDB 机制更加耗时,因为要重新执行 AOF 文件中的所有操作命令。

综上所述,RDB 适合用于数据集较大、备份、恢复数据和迁移数据等场景,AOF 适合用于数据可靠性要求高、数据恢复稳健等场景。

3.Nginx 是什么?它有哪些应用场景?

Nginx(发音为“engine-x”)是一个高性能的开源Web服务器和反向代理服务器,可以处理大量的并发连接和请求。它使用事件驱动的异步架构和多线程设计,可以高效地处理并发请求,同时也支持反向代理、负载均衡、动态HTTP缓存、SSL/TLS终止、基于模块的扩展等功能。

Nginx 的应用场景非常广泛,以下是其中的几个:

  1. Web 服务器:Nginx 可以作为 HTTP 服务器,处理并发的静态请求和动态请求,并且可以支持负载均衡和缓存,为网站提供高性能和高可用性。

  2. 反向代理服务器:Nginx 可以作为反向代理服务器,接收客户端请求并将其转发到后端服务器,同时也可以支持负载均衡和缓存。

  3. 邮件代理服务器:Nginx 可以作为邮件代理服务器,支持 POP3、IMAP 和 SMTP 协议,并且可以支持 SSL/TLS 加密和反垃圾邮件功能。

  4. 流媒体服务器:Nginx 可以作为流媒体服务器,支持 RTMP、HLS 和 DASH 协议,可以用于实现直播、点播和视频-on-demand(VoD)等场景。

总之,Nginx 具有高性能、可扩展性和可靠性等特点,被广泛应用于大型网站、互联网公司、云计算、视频流媒体、游戏等领域。

你可能感兴趣的:(数据库,mysql,java)