1、Ngnix 是什么?它有哪些应用场景?
Nginx是一款高性能的Web服务器软件,也可以作为反向代理服务器、负载均衡器、HTTP缓存和安全防护等多种用途。Ngnix可以将服务器上的静态文件(html、css、图片)通过HTTP协议返回给浏览器客户端。Ngnix是基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
Nginx的应用场景包括:
Web服务器:Nginx可以作为Web服务器,提供静态文件和动态文件(如PHP)的处理。如静态HTML页面、CSS、JavaScript、图片等,它能够快速响应客户端的请求,提高网站的访问速度。
反向代理服务器:Nginx可以作为反向代理服务器,将请求转发到后端服务器,实现负载均衡和高可用性。
负载均衡器:Nginx可以作为负载均衡器,将客户端的请求均衡分配到多个应用服务器上,从而达到分摊负载的效果,提高系统的可靠性和性能。
HTTP缓存:Nginx可以作为HTTP缓存,缓存静态文件和动态文件,从而减少后端应用服务器的负载,提高网站的访问速度。
安全防护服务器:Nginx可以作为安全防护服务器,通过设置防火墙、反向代理等技术,防止恶意攻击和DDoS攻击,防止恶意攻击和DDoS攻击,保障网站的安全性,,保障网站的安全性。
WebSocket服务器:Nginx支持WebSocket协议,可以作为WebSocket服务器,实现实时通信、即时聊天等功能。
2、MVCC 是什么?InnoDB 是如何实现 MVCC 机制的?
MVCC (Multiversion Concurrency Control) 中文全程叫多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的吞吐性能。
MVCC的实现原理是在每个数据行上维护多个版本,每个版本有一个时间戳,当一个事务读取数据时,它只能读取时间戳早于自己的版本,从而避免了读写冲突。当一个事务向数据库中插入或更新数据时,它会创建一个新的版本,并将新版本的时间戳设置为当前时间戳。
MVCC的优点是:
提高了数据库的并发性能,因为多个事务可以同时读取同一数据。
避免了读写冲突,从而提高了数据库的稳定性和可靠性。
支持数据库的多版本查询,可以查询某个时间点的数据,从而支持历史数据分析和审计等功能。
MVCC的缺点是:
需要占用更多的存储空间,因为每个数据行需要维护多个版本。
实现复杂度较高,需要在数据库引擎中进行支持。
在高并发的场景下,可能会出现大量的版本,从而导致查询性能下降。
InnoDB通过在每一行数据后面存储两个隐藏的列来实现MVCC,这两个列分别是创建时间和过期时间。当一个事务开始时,它会得到一个唯一的事务ID,这个事务ID会用于数据行的版本控制。
在InnoDB中,每个事务看到的数据版本是不同的,这是因为InnoDB根据事务的启动时间和数据行的版本创建一个视图。当一个事务开始时,InnoDB会为它创建一个新的视图,这个视图包含了当前所有活跃的事务和它们的版本号。在事务执行过程中,它只能看到在它启动之前已经提交的事务所创建的版本,而看不到其他事务正在修改的版本。
当一个事务向数据库中插入或更新数据时,InnoDB会创建一个新的数据版本,并将新版本的创建时间设置为当前时间戳,同时将过期时间设置为无穷大。当一个事务删除一条数据时,InnoDB会将这条数据的过期时间设置为当前时间戳,从而标记这条数据为已经过期。
当一个事务查询数据时,InnoDB会根据事务的启动时间和数据行的版本号来确定它所能看到的数据版本。如果查询的数据版本已经过期,那么这条数据就被视为不存在,从而避免了脏读的问题。
总之,InnoDB通过MVCC实现了高并发的数据库事务控制,保证了数据库的稳定性和可靠性。
以下是InnoDB如何实现MVCC的具体过程:
InnoDB在每个数据行后面维护两个隐藏列,分别为创建时间和过期时间。
当一个事务开始时,InnoDB会为它创建一个新的视图,这个视图包含了当前所有活跃的事务和它们的版本号。
当一个事务插入或更新一条数据时,InnoDB会创建一个新的数据版本,并将新版本的创建时间设置为当前时间戳,同时将过期时间设置为无穷大。
当一个事务删除一条数据时,InnoDB会将这条数据的过期时间设置为当前时间戳,从而标记这条数据为已经过期。
当一个事务查询数据时,InnoDB会根据事务的启动时间和数据行的版本号来确定它所能看到的数据版本。如果查询的数据版本已经过期,那么这条数据就被视为不存在。
当一个事务提交时,InnoDB会将这个事务所创建的所有数据版本的过期时间设置为当前时间戳,从而将这些数据版本标记为已经过期。
当一个事务回滚时,InnoDB会将这个事务所创建的所有数据版本删除,并将这些数据版本从视图中移除。
当一个事务长时间占用一条数据行时,InnoDB会定期清理过期的数据版本,从而避免数据版本过多导致查询性能下降。
假设有两个事务T1和T2,T1在时间点t1开始,T2在时间点t2开始,它们操作同一行数据:
在时间点t1,T1开始执行,此时数据行的版本为V1,创建时间为t1,过期时间为无穷大。
在时间点t2,T2开始执行,此时数据行的版本为V1,创建时间为t1,过期时间为无穷大。
在时间点t3,T1更新了该数据行,此时数据行的版本为V2,创建时间为t3,过期时间为无穷大。
在时间点t4,T2查询该数据行,此时T2能够看到的数据版本是V1,因为T2的启动时间早于t3,所以它看不到T1更新的数据。
在时间点t5,T1提交了事务,此时T1所创建的所有数据版本的过期时间被设置为t5,从而将这些数据版本标记为已经过期。
在时间点t6,T2再次查询该数据行,此时T2能够看到的数据版本是V2,因为V1已经过期了,而V2是在T2启动之后创建的。
3、Redis 的持久化机制有哪些?说说各自的优缺点和应用场景?
Redis的持久化机制主要有两种: RDB(Redis DataBase)和 AOF(Append-Only File)。
RDB
RDB是Redis的一种快照持久化方式,它会将Redis在某个时间点上的数据集合持久化到磁盘上的一个二进制文件中。RDB的优点是:
RDB文件非常紧凑,非常适合用于备份和灾难恢复。
RDB文件的生成和载入速度都比AOF快,适合大规模数据的恢复。
RDB的缺点是:
RDB是按照时间点快照的方式持久化数据,如果Redis在最后一次快照之后发生故障,那么最后一次快照之后的数据将会丢失。
RDB文件生成的频率比AOF低,如果Redis在两次快照之间发生故障,那么快照之后的数据将会丢失。
RDB适用于数据集较大,但是对数据完整性要求不高的场景,如备份和灾难恢复等。
AOF
AOF是Redis的另一种持久化方式,它会将Redis的写命令追加到一个文件中,当Redis重启时,可以通过重新执行AOF文件中的写命令来恢复数据。
AOF的优点是:
AOF可以保证Redis的数据完整性,因为它是按照写命令来持久化数据的,即使Redis在最近一次写命令之后发生故障,也只会丢失最近一条写命令之后的数据。
AOF文件是一个普通文本文件,可以很容易地进行备份和恢复。
AOF的缺点是:
AOF文件通常比RDB文件大,因为它记录了所有的写命令。
AOF文件的载入速度比RDB慢,适合小规模数据的恢复。
AOF适用于数据完整性要求较高的场景,如金融、电信、电商等。