ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

金证面试

2021-09-27 21:01:39  阅读:162  来源: 互联网

标签:UDP 版本号 数据库 redis TCP 金证 面试 进程



ayout: post
title: "金证面试 21-9.14"
date: 2021-9-20 20:52:07
categories: python
tags: 面试
image: /images/pic02.jpg

写在前面:
面试时间为2021-9-14,面试主要涉及下述问题,有些答上来,有些当时没答上来,查阅资料后统一整理。职位为运维开发工程师,总结数据库考察较多,操作系统和网络其次,基本未涉及编码,可能跟面试岗位有关

数据库

MYSQL 数据库

1.事务

数据库事务(Database Transaction)
,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
彻底理解数据库事务: http://www.hollischuang.com/archives/898

2、乐观锁和悲观锁

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

乐观锁与悲观锁的具体区别: https://juejin.cn/post/6844903639207641096#heading-1

3、innodb 引擎如何实现MVCC

innodb会为每一行添加两个字段,分别表示该行创建的版本删除的版本,填入的是事务的版本号,这个版本号随着事务的创建不断递增。在repeated
read的隔离级别(事务的隔离级别请看这篇文章)下,具体各种数据库操作的实现:

  • select:满足以下两个条件innodb会返回该行数据:

  • 该行的创建版本号小于等于当前版本号,用于保证在select操作之前所有的操作已经执行落地。

  • 该行的删除版本号大于当前版本或者为空。删除版本号大于当前版本意味着有一个并发事务将该行删除了。

  • insert:将新插入的行的创建版本号设置为当前系统的版本号。

  • delete:将要删除的行的删除版本号设置为当前系统的版本号。

  • update:不执行原地update,而是转换成insert +
    delete。将旧行的删除版本号设置为当前版本号,并将新行insert同时设置创建版本号为当前版本号。

其中,写操作(insert、delete和update)执行时,需要将系统版本号递增。

由于旧数据并不真正的删除,所以必须对这些数据进行清理,innodb会开启一个后台线程执行清理工作,具体的规则是将删除版本号小于当前系统版本的行删除,这个过程叫做purge。

通过MVCC很好的实现了事务的隔离性,可以达到repeated
read级别,要实现serializable还必须加锁。

4、引擎类别

在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODBBERKLEY(BDB),也常常可以使用。

ISAM

  ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。

MYISAM

  MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE
TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。

  MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。

HEAP

  HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。

INNODB和BERKLEYDB

  INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MYSQL++
API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MYISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

5.索引的工作原理及其种类

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现通常使用B树以其变种B+树。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)

6、隔离

图片

7、事务的四大隔离级别实践

既然并发事务存在脏读、不可重复、幻读等问题,InnoDB实现了哪几种事务的隔离级别应对呢?

  • 读未提交(Read Uncommitted)

  • 读已提交(Read Committed)

  • 可重复读(Repeatable Read)

  • 串行化(Serializable)

Redis 数据库

1、Redis宕机怎么解决?

宕机:服务器停止服务

如果只有一台redis,肯定会造成数据丢失,无法挽救

多台redis或者是redis集群,宕机则需要分为在主从模式下区分来看:

slave从redis宕机,配置主从复制的时候才配置从的redis,从的会从主的redis中读取主的redis的操作日志,在redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;

如果从数据库实现了持久化,此时千万不要立马重启服务,否则可能会造成数据丢失,正确的操作如下:在slave数据上执行SLAVEOF
ON
ONE,来断开主从关系并把slave升级为主库,此时重新启动主数据库,执行SLAVEOF,把它设置为从库,连接到主的redis上面做主从复制,自动备份数据。

以上过程很容易配置错误,可以使用redis提供的哨兵机制来简化上面的操作。简单的方法:redis的哨兵(sentinel)的功能

2、Redis集群方案该怎么做?都有哪些方案?

1、redis
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据客恢复到新hash节点

2、redis
cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方介绍

3、在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的字典脚本恢复,实例的监控,等等

3、基本数据类型

缓存穿透、击穿、雪崩

穿透:

​ 正常情况下,查询数据无论在缓存中或者数据库中,都应该有这样的数据。但如果这个数据在缓存和数据库都不存在,那么用户高并发环境下访问数据库缓存中都不存在的数据称之为缓存穿透现象.

解决方案:

解决方案

1). 禁用IP 限制IP访问.

2). 限流 每秒最多访问3次

3).布隆过滤器

4).缓存空值(简单粗暴)

击穿

在高并发的环境下,大量请求同时请求同一个key,如果恰巧这个时候key失效了。那么当某个热点数据在缓存中突然失效.导致大量的用户直接访问数据库.导致并发压力过高造成异常这个现象被称为缓存击穿

后果:

造成某个时刻所有访问直接打在数据库上,导致数据库压力剧增

解决翻案:
  • 尽可能将热点数据的超时时间 设定的长一点

  • 设定多级缓存 超时时间采用随机算法.

雪崩

在缓存服务器中,由于大量的缓存数据失效,导致用户访问的命中率过低.导致直接访问数据库.例如缓存服务宕机,然后大量请求直接访问数据库,极有导致数据库也宕机.

后果:

导致缓存、数据库等一系列服务宕机

解决方案

设定超时时间时,应该采用随机算法

持久化

对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,

  • 根据时间,更新次数的快照(save 300 10 )
  • 基于语句追加方式(Append-only file,aof)

计算机网络

1、Cookie和Session

Cookie Session
储存位置 客户端 服务器端
目的 跟踪会话,也可以保存用户偏好设置或者保存用户名密码等 跟踪会话
安全性 不安全 安全

session技术是要使用到cookie的,之所以出现session技术,主要是为了安全。

2、apache 和 nginx 的区别

nginx 相对 apache 的优点:
  • 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源

  • 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而 apache
    则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能

  • 配置简洁

  • 高度模块化的设计,编写模块相对简单

  • 社区活跃

apache 相对 nginx 的优点:
  • rewrite ,比 nginx 的 rewrite 强大

  • 模块超多,基本想到的都可以找到

  • 少 bug ,nginx 的 bug 相对较多

  • 超稳定

3.中间人攻击

中间人攻击(Man-in-the-middle
attack,通常缩写为MITM)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。

4.简述TCP和UDP的区别以及优缺点?

TCP 的优点:

可靠,稳定。

TCP 的可靠体现在 TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP 的缺点:

慢,效率低,占用系统资源高,易被攻击。

TCP 在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的 CPU、内存等硬件资源。

而且,因为 TCP 有确认机制、三次握手机制,这些也导致 TCP 容易被人利用,实现 DOS、DDOS、CC 等攻击。

UDP 的优点:

快,比 TCP 稍安全。

UDP 没有 TCP 的握手、确认、窗口、重传、拥塞控制等机制,UDP 是一个无状态的传输协议,所以它在传递数据时非常快。没有 TCP 的这些机制,UDP 较 TCP 被攻击者利用的漏洞就要少一些。但 UDP 也是无法避免攻击的,比如:UDP Flood 攻击。

UDP 的缺点:

不可靠,不稳定。

因为 UDP 没有 TCP 那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

基于上面的优缺点,那么,TCP 和 UDP 的应用场景都有哪些呢?

TCP 应用场景:

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如 HTTP、HTTPS、FTP 等传输文件的协议,POP、SMTP 等邮件传输的协议。

在日常生活中,常见使用 TCP 协议的应用如下: 浏览器用的 HTTP, FlashFXP 用的 FTP,Outlook 用的 POP、SMTP,Putty 用的 Telnet、SSH,QQ 文件传输。

UDP 应用场景:

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用 UDP。

比如,日常生活中,常见使用 UDP 协议的应用如下:QQ 语音,QQ 视频,TFTP 等。有些应用场景对可靠性要求不高会用到 UPD,比如长视频,要求速率。

TCP 与 UDP 区别总结:

1、TCP 面向连接(如打电话要先拨号建立连接); UDP 是无连接的,即发送数据之前不需要建立连接。

2、TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。

3、TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;UDP 是面向报文的。UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条 TCP 连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

5、TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节。

6、TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。

浏览器访问一个网站的过程(百度为例)?:

  1. 浏览器获取输入的域名 www.baidu.com

  2. 浏览器向DNS请求解析www.baidu.com的IP地址

  3. 域名系统DNS解析出百度服务器的IP地址

  4. 浏览器与该服务器建立TCP连接(默认端口号80)

  5. 浏览器发出HTTP请求,请求百度首页

  6. 服务器通过HTTP响应把首页文件发送给浏览器

  7. TCP连接释放

  8. 浏览器将首页文件进行解析,并将Web页显示给用户。

操作系统

1、unix进程间通信方式(IPC)

  1. 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

  2. 命名管道(named
    pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

  3. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

  4. 消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system
    V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

  5. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

  6. 内存映射(mapped
    memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。

  7. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

  8. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System
    V的变种都支持套接字。

2、什么是僵尸进程和孤儿进程?怎么避免僵尸进程?

  • 孤儿进程: 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被 init
    进程(进程号为1)所收养,并由 init 进程对他们完成状态收集工作。

  • 僵尸进程: 进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或
    waitpid
    获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。

3、并行(parallel)和并发(concurrency)?

并行: 同一时刻多个任务同时在运行

并发:不会在同一时刻同时运行,存在交替执行的情况。

4、说说下面几个概念:同步,异步,阻塞,非阻塞?

  • 同步: 多个任务之间有先后顺序执行,一个执行完下个才能执行。

  • 异步:
    多个任务之间没有先后顺序,可以同时执行,有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!

  • 阻塞: 如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。

  • 非阻塞: 如果不会卡住,可以继续执行,就是说非阻塞的。

同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。

标签:UDP,版本号,数据库,redis,TCP,金证,面试,进程
来源: https://www.cnblogs.com/wheaesong/p/15345193.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有