腾讯GM面经总结

1.非关系数据库
Redis 支持的数据结构丰富,包括hash、set、list等。

MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。

MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

Redis 事务支持比较弱,只能保证事务中的每个操作连续执行

mongodb不支持事务

集群

MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。

Memcached与Redis有什么区别

Redis 和 Memcached 都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务,其本质上就是一个内存key-value数据库。
与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。Memcached基本只支持简单的key-value存储
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化
value 值大小不同:Redis 最大可以达到 512M;memcache 只有 1mb。
单线程的redis为什么这么快
(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制

一致性哈希算法原理

首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。
然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。
腾讯GM面经总结_第1张图片
 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务
 一般的,在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。例如系统中只有两台服务器,其环分布如下,

此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。

MyisAM和innodb

MyISAM( 非聚集)
使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
InnoDB( 聚集索引)
第一个重大区别是InnoDB的数据文件本身就是索引文件, 这棵树的叶节点data域保存了完整的数据记录。分为主索引,辅助索引,辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

红黑树

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
6.根节点到叶子最长不会超过最短的二倍
红黑树是一种平衡树,他复杂的定义和规则都是为了保证树的平衡性,B 树又叫平衡多路查找树,正因为文件系统和数据库一般都是存在电脑硬盘上的,如果数据量太大的话不一定能一次性加载到内存中。(一棵树不能一次性加载完怎么查找对吧?)但是B树可以多路存储。也正因为B树的这一个优点,可以在文件查找的时候每次只加载一个节点的内容存入内存来查找。而红黑树在内存中查找非常块,但是如果在数据库和文件系统中,显然B树更优。
B+树是在B树的基础上进行改造的,他的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。
B+树多用于数据库中的索引。支持范围查找,节点更小

分库分表

通过分表,可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少了,起到提高查询性能,缩短查询时间的作用,此外,可以很大的缓解表锁的问题。
分表策略可以归纳为垂直拆分和水平拆分。
水平分表:取模分表就属于随机分表,而时间维度分表则属于连续分表。
如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表. 将大文本的字段单独拆分到另外一张扩展表, 将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。
对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。

库内分表,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。

微信红包设计

微信红包的本质就是随机产生一个金额,我从随机数产生方面去回答的。
先测试界面吧,一些组件有没有位置异常,然后是测试代码的稳定性和它的性能以及安全性。稳定性的话主要看它会不会因为红包的数量增大导致随机产生的金额差距较大

  • 架构设计有两个原则最重要:第一个是抽象出原子业务,原子业务就是最小的不可分割的业务; 第二个是扩展,对原子业务进行继承和组合,实现不可预知的与时如流的具体需求,但原子业务本身(尽量)不做修改。
  • A给B发了一个数额为X的红包,A账户扣掉X元。24小时内,B可以查看红包,并决定是否拆红包,如果拆红包,B的账户增加X元。超过24小时B没有拆红包,红包失效,X元退还到A的账户。
  • A在群里发红包,每人都可以拆一个X元红包; A在群里发红包,红包总额X元,每人拆红包得到随机金额。微信红包的人数上限是100人,每个微信群的上限是500人,因此每个红包最多有500人同时进行查看和拆包,这个量级单机能很好地处理。如果微信红包的人数没有上限,可能会出现A给十亿人发红包的场景,如果微信群的人数没有上限,可能会出现十亿人查看和拆红包,这个量级单机无法处理,需要分布式处理、、、

测试
.当余额不足时,红包发送失败
7.在红包描述里是否可以输入汉字,英文,符号,表情,纯数字,汉字英语符号,
7.1是否可以输入它们的混合搭配
8.输入红包钱数是不是只能输入数字,用户是否可以多次抢一个红包
发红包的人是否还可以抢红包多人
断网时,无法抢红包
支付成功后,退回聊天界面
2.性能
弱网时抢红包,发红包时间
不同网速时抢红包,发红包的时间
.发红包和收红包成功后的跳转时间

3.安全
红包被领取以后,发送红包人的金额会减少,收红包金额会增加
3.发送红包失败,余额和银行卡里的钱数不会少
4.红包发送成功,是否会收到微信支付的通知

操作系统

操作系统最小调度单位是线程
进程是进行系统资源分配、调度和管理的最小单位

  • 同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢?
    共享的资源有
    a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
    b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
    c. 静态变量
  • a. 栈 栈是独享的
    b. 寄存器 这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

TCP拥塞控制方法
主要有四种算法:慢开始、拥塞避免、快重传、快恢复。
快恢复算法,将门限值(ssthresh)调整为此时cwnd的一半,并执行拥塞避免算法。

操作系统
在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时) 和同步(完成异步的两个进程的协作)两种关系.
V操作:
P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放。执行V操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程.

进程通信的方式IPC(Inter-Process Communication)

  • 管道这种通讯方式有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。如fork或exec创建的新进程,子进程的优点,比如读写速度、数据单向流通。
  • 信号量,信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识。
    消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号(singnal)
    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    主要作为进程间以及同一进程不同线程之间的同步手段。
  • 共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现。
    所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样。如果一个进程向共享内存中写入了数据,所做的改动将立刻被其他进程看到。
    共享内存是IPC最快捷的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则是需要将数据通过中间机制进行转换。共享内存方式直接将某段内存段进行映射,多个进程间的共享内存是同一块的物理空间
  • 套接字(socket)
    套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信

进程间通信方式的选择
PIPE和FIFO(有名管道)用来实现进程间相互发送非常短小的、频率很高的消息,这两种方式通常适用于两个进程间的通信
共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据;这种方法适用于多进程间的通信
其他考虑用socket。主要应用在分布式开发中

重载(Overload)和重写(Override)的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

TCP,UDP,IP包头格式及说明

ip数据包,源IP,目的IP,长度,偏移,校验和,生存时间
腾讯GM面经总结_第2张图片
tcp包头结构
腾讯GM面经总结_第3张图片
udp
腾讯GM面经总结_第4张图片
均包含源端口,目的端口,tcp 更长,20, udp8,因为包含了确认序号,16位校验和,窗口大小(即滑动窗口控制)

以下多线程对 int 型变量x的操作,哪几个需要进行同步

x=y
x++
++x
x=1, 只要看操作受不受多线程的影响,是否加锁

A,因为y的初值不确定,所以要加锁

B和C却需要执行2步操作,所以也需要加锁

只有D的结果不受多线程影响

所以选ABC

IO,NIO,AIO底层原理

区分同步或异步:同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回
区分阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如 ServerSocket 新连接建立完毕,或数据读取、写入操作完成;而非阻塞则是不管 IO 操作是否结束,直接返回,相应操作在后台继续处理。
IO概念
传统的 java.io 包,它基于流模型实现。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里
NIO概念:
在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序。
NIO 的主要组成部分:
Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的 Buffer 实现。
Channel:类似在 Linux 之类操作系统上看到的文件描述符,用来支持批量式 IO 操作的一种抽象。
Selector,是 NIO 实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在 Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态
AIO概念
在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

中断与异常的区别

中断是指 CPU 对系统发生某事件时的这样一种响应:

CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。

外中断——就是我们指的中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
内中断——就是异常——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
中断则是由于系统中某事件引起的,该事件与现行指令无关。

https安全证书

SSL证书是数字证书的一种,类似于驾驶证、护照2113和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证5261书。SSL证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能
腾讯GM面经总结_第5张图片

抓包工具

抓包工具,检查数据加密
安全测试方面,我们需要检查敏感数据在传输过程中是否加密,也需要借助抓包工具才能检查
处理前后端 bug 归属之争
在我们提交bug的时候,经常会出现前端(客户端展示)和后端(服务端的逻辑)的争议,那么可以通过抓包工具,确实是数据传递问题还是前端显示的问题。如果抓出来的数据就有问题的话,那么一般是后端的问题;如果抓出来的数据是正确的,那么基本上可以断定是前端显示的问题。

wireshark是捕获机器上的某一块网卡的网络包,使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。用wireshark实际分析下三次握手的过程。
表达式规则

  1. 协议过滤

比如TCP,只显示TCP协议。

  1. IP 过滤

比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,

ip.dst==192.168.1.102, 目标地址为192.168.1.102

  1. 端口过滤

tcp.port ==80, 端口为80的

tcp.srcport == 80, 只显示TCP协议的愿端口为80的。

  1. Http模式过滤

腾讯GM面经总结_第6张图片
WireShark抓Https数据流程分析
抓包 HTTPS 通信主要包括三个过程:TCP 建立连接、TLS 握手、TLS 加密通信,主要分析 HTTPS 通信的握手建立和状态等信息。
TLS 1.0就是SSL 3.1版本
腾讯GM面经总结_第7张图片
结合你学习的过程就可以分析出来了
(1).client_hello
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息

第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法。这个过程简单来说是这样的:

浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, …]发给服务器;

服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器;

浏览器与服务器使用匹配的Cipher进行后续通信。如果服务器没有找到匹配的算法,浏览器(以Firefox
30为例,后续例子中使用的浏览器均为此版本的Firefox)将给出错误信息:

(2).server_hello+server_certificate+sever_hello_done
• server_hello, 服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S 等,其中随机数用于后续的密钥协商;
• server_certificates, 服务器端配置对应的证书链,用于身份验证与密钥交换;
• server_hello_done,通知客户端 server_hello 信息发送结束;
(3).证书校验
客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:
• [证书链]的可信性 trusted certificate path,方法如前文所述;
• 证书是否吊销 revocation,有两类方式离线 CRL 与在线 OCSP,不同的客户端行为会不同;
• 有效期 expiry date,证书是否在有效时间范围;
• 域名 domain,核查证书域名是否与当前的访问域名匹配
(4).client_key_exchange+change_cipher_spec+encrypted_handshake_message
(a) client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;
(b) 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,计算得到协商密钥;
(5).change_cipher_spec+encrypted_handshake_message
(a) 服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,计算得到协商密钥

百度、谷歌搜索引擎为什么能快速得到结果

搜索结果速度这么快是因为你搜索的词之前大部分都搜索过了,你看到的不过是缓存而已
搜索的整个过程是从前端到后端,依次是cache(缓存),哈希,倒排索引
Cache(缓存):每个模块,每个切分粒度,每个算法都会有自己的Cache,例如整个查询语句可能没有cache,但切词以后的基本词肯定有人查过,就可以直接读取cache。
对于没有Cache的情况:除了靠并行查询和高效的倒排索引集合求交算法,还有很复杂的查询策略优化,比如尽可能先查询高优先级的网页库。
英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排。但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A。
一般是以文档ID作为索引,以文档内容作为记录。而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档
常规的索引是文档到关键词的映射:
文档——>关键词
但是这样检索关键词的时候很费力,要一个文档一个文档的遍历一遍。(这事不能忍~)
于是人们发明了倒排索引~
倒排索引是关键词到文档的映射
关键词——>文档

哈希表

hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表
冲突了,
开放定制:线性探测法,加链表的方式,再散列法

先来先服务调度算法,短作业(进程)优先调度算法,
高响应比优先调度算法(取决于等待时间和服务时间的比值)时间片轮转法,多级反馈队列调度算法

设计模式

1.创建型模式

a) 工厂模式

b) 抽象工厂模式

c) 单例模式

d) 建造者模式

2.结构型模式

a) 适配器模式

b) 装饰器模式

c) 桥接模式

d) 代理模式

3.行为型模式

b) 责任链模式

c) 策略模式

d) 观察者模式

建造者模式,是将一个复杂的对象的构建与它的表示分离,使
得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

用户只需要给出指定复杂对象的类型和内容;
建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
建造者模式与抽象工厂模式的比较:
与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

责任链模式:filter的应用, 是先定义好一个链表,然后在通过任意一节点后,如果此节点有后继节点,那么传递下去,这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
观察者模式:观察者订阅自己关心的主题和主题有数据变化后通知观察者们
策略模式策略模式太常用了,所以把它放到最前面进行介绍。它比较简单,我就不废话,直接用代码说事吧。我们需要画一个图形,可选的策略就是用红色笔来画,还是绿色笔来画,或者蓝色笔来画。,都实现了一个相同的接口,
**桥梁模式:**桥梁模式在左侧加了一层抽象而已。桥梁模式的耦合更低,结构更复杂一些,桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别开来,使得它们可以松散的组合,比如3中不同型号的笔,5中颜色,要写15个类,但是面向接口编程,脱耦就是指将他们之间的强关联解除,但是在桥梁模式中是指将它们之间的强关联改换成弱关联。
适配器模式:将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

流量劫持?及常见网络攻击方式

DNS 劫持
如同 ARP 将 IP 解析成 MAC 地址 一样,DNS 负责将域名解析成 IP 地址。作为网络层的服务,面对的用户更广泛,当然面临的风险也大的多。一旦遭到入侵,所有用户都倒霉了。近些年的重大网络事故无不和 DNS 有关。

DNS 服务一旦被黑客控制,用户发起的各种域名解析,都将被暗中操控。将正常网站解析成黑客服务器的 IP,并事先开启了 HTTP 代理,用户还是能正常上网,并且几乎看不出任何破绽;只不过所有流量都是经由黑客的代理服务器收发的,因而黑客可以轻易获取各种明文传输的密码,比如各种网站账号信息都将一览无余。
sql注入:要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨, or 1==1,在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误说明此页面存在SQL注入,如果页面正常显示说明有字符被过滤或者不存在注入,读者可自行测试

  • 应对方法
    (简单又有效的方法)PreparedStatement
    采用预编译语句集,它内置了处理SQL注入的能力,sql注入只对sql语句的准备(编译)过程有破坏作用
    而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,不再对sql语句进行解析
    2.使用正则表达式过滤传入的参数
    3.用该函数检查是否包函非法字符,总之不能直接拼接,默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,$直接拼接

XSS 攻击

XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去
  反射型XSS
  1. 攻击者在url后面的参数中加入恶意攻击代码。
2. 当用户打开带有恶意代码的URL的时候,网站服务端将恶意代码从URL中取出,拼接在html中并且返回给浏览器端。
3. 用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。
4. 攻击者通过恶意代码来窃取到用户数据并发送到攻击者的网站。攻击者会获取到比如cookie等信息,然后使用该信息来冒充合法用户的行为,调用目标网站接口执行攻击等操作
存储型XSS:
1. 攻击者将恶意代码提交到目标网站数据库中。
2. 用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。
3. 用户浏览器接收到响应后解析执行,那么其中的恶意代码也会被执行。
4. 那么恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该
cookie然后会冒充该用户的行为,调用目标网站接口等违法操作

如何防止
后端需要对提交的数据进行过滤。
前端也可以做一下处理方式,比如对script标签,将特殊字符替换成HTML编码这些

CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性
CSRF攻击攻击原理及过程如下:

   1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

   2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

   3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

   4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

   5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。 

CSRF受害者必须依次完成两个步骤:
  1.登录受信任网站A,并在本地生成Cookie。
  2.在不登出A的情况下,访问危险网站B

http 1.0 1.1 2.0 3.0的特点及其区别

  • HTTP 1.0
    短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能
    无host头域,也就是http请求头里的host,
    不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象
  • HTTP 1.1
    长连接,流水线,使用connection:keep-alive使用长连接,也就是一次连接可以发送多个请求,客户端通知服务器返回本次请求结果后保持连接,当然也可以设置为close,(由于长连接会给服务器造成压力)HTTP 1.1还提供了与身份认证,断点续传
  • HTTP2.0
    头部压缩,首部压缩(Header Compression)
    HTTP/1.1并不支持 HTTP 首部压缩,双方,各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小
    多路复用多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。在 HTTP/1.1 协议中浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一
    二进制分帧
    HTTP/2在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层,在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码
  • HTTP 3.0
    基于google的QUIC协议,(Quick UDP Internet Connections)基于UDP的传输层协议,提供像TCP一样的可靠性,而quic协议是使用udp实现的,可以选择在应用层使用HTTP2.0实现多路传输,在物理层使用CDN解决网络拥塞和最后一公里问题
    CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定,CDN的关键技术主要有内容存储和分发技术
    减少了tcp三次握手时间,以及tls握手时间

电梯调度算法

先来先服务算法(FCFS)
最短寻找楼层时间优先算法
扫描算法(SCAN 免去了电梯频繁的来回移动。
循环扫描算法
PI算法
PI(Priority Inversion)算法将请求队列中的请求分成两个优先级,它首先保证高优先级队列中的请求得到及时响应

Linux命令

top 命令以看到总体的系统运行状态和cpu的使用率
free命令查看总内存、使用、空闲等情况
ps(process status)命令用来汇报进程状态
查看所有端口、进程的使用情况:netstat -tunlp
(1)常用命令1

ps -u 用户名 查看指定用户的信息

(2)显示某个进程信息

ps -ef| grep 进程名

(3)列出目前所有正在内存当中的程序

ps aux

可以通过在程序中插入打印语句。有点能够显示程序的动态过程,比较容易的检查出源程序中的有关信息,在Linux上利用core dump和GDB调试segfault(段错误),
strace
(1)我们知道在进行创建文件或者复制文件这些操作的时候,应用程序需要和操作系统进行一些交互。但是我们的程序一般不能直接访问linux的内核。但是应用程序会跳转到system_call的内核位置,内核然后检查系统的调用号,然后这个号码告诉内核需要什么服务
gdb

a:启动程序可以按照用户自定义的要求随心所欲的运行程序

b:可以被调试的程序在指定的断点挺住

c:当程序停住时候可以检查程序的运行状态

select、poll、epoll之间的区别

select时间复杂度O(n)
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度
需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大,有最大连接限制

poll时间复杂度O(n)
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

epoll时间复杂度O(1)

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd,软硬盘
无最大连接限制
epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式
LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了

poll为什么要有EPOLLET触发模式?

如果采用EPOLLLT模式的话,系统中一旦有大量你不需要读写的就绪文件描述符,它们每次调用epoll_wait都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率.。而采用EPOLLET这种边沿触发模式,它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符

select、poll、epoll 区别总结:

  • select单个进程所能打开的最大连接数,poll,poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储‘;epoll虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接

  • FD剧增后带来的IO效率问题
    select因为每次调用时都会对连接进行线性遍历,poll同上,epoll因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,如果同时活跃的时候,也会引发效率的问题。

  • 消息传递方式
    select内核需要将消息传递到用户空间,都需要内核拷贝动作,poll同上;epoll,epoll通过内核和用户空间共享一块内存来实现的。

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。

1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

SQL在一个表中可以有多个聚簇索引

聚簇索引的顺序就是数du据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无zhi关,叶节点仍然是索引节点,只dao不过有一个指针指向对应的数据块。所以一个表最多只能有一个聚簇索引,非聚集索引可以有多个

数据库容灾(redolog/binlog

参考Redis,主从复制,读写分离,自己捋一下,极有可能会问
https://blog.csdn.net/diweikang/article/details/94406186

性能测试中如何定位性能瓶颈

如果功能测试是可用,易用,满足需求、用户使用为目的,性能测试无非就是让这些目的更流畅。没有什么专业的概念,无非实现两个字:好用!
CPU瓶颈问题
1、System%Total processor time如果该值持续超过90%,且伴随处理器阻塞,则说明整个系统面临着处理器方面的瓶颈.

注:在某些多CPU系统中,该数据虽然本身并不大,但CPU之间的负载状况极不均衡,此时也应该视作系统产生了处理器方面的瓶颈.
2、排除内存因素,如果Processor %Processor Time计数器的值比较大,而同时网卡和硬盘的值比较低,那么可以确定CPU 瓶颈。(内存不足时,有点进程会转移到硬盘上去运行,造成性能急剧下降,而且一个缺少内存的系统常常表现出很高的CPU利用率,因为它需要不断的扫描内存,将内存中的页面移到硬盘上。
造成高CPU使用率的原因:

频繁执行程序,复杂运算操作,消耗CPU严重

数据库查询语句复杂,大量的 where 子句,order by, group by 排序等,CPU容易出现瓶颈

内存不足,IO磁盘问题使得CPU的开销增加
磁盘I/O分析
【监控指标】:PhysicalDisk/%Disk time,PhysicalDisk/%Idle Time,Physical Disk\ Avg.Disk Queue Length, Disk sec/Transfer
Throughput(吞吐率),Connections(连接数)
如何定位这些性能问题:

  1. 查看系统日志,日志是定位问题的不二法宝,如果日志记录的全面,很容易通过日志发现问题。

比如,系统宕机时,系统日志打印了某方法执行时抛出out of memory的错误,我们就可以顺藤摸瓜,很快定位到导致内存溢出的问题在哪里。

  1. 利用性能监控工具,比如:JAVA开发B/S结构的项目,可以通过JDK自带的Jconsole,或者JProfiler,来监控服务器性能,Jconsole可以远程监控服务器的CPU,内存,线程等状态,并绘制变化曲线图。
    我们需要关注的性能点有:CPU负载,内存使用率,网络I/O等,磁盘是计算机中速度最慢的一个子系统,因此很多情况中,磁盘I/O会成为系统的瓶颈。实际上在设计高性能系统的时候,会把避免磁盘I/O作为一个首要准则。
    网络带宽在一些情况下也会成为系统的瓶颈。一旦在业务的请求和响应中包含较大的数据传输时,往往会遇到网络瓶颈。因为更多的时候服务器采用的还是以太网卡,1000M网卡在全双工模式下传输速率也只有80M/s,如果响应中包含报表、图片之类的大尺寸数据,很有可能在性能测试中出现网络瓶颈
  2. 工具和日志只是手段,除此之外,还需要设计合理的性能测试场景

具体场景有:性能测试,负载测试,压力测试,稳定性测试,浪涌测试等

好的测试场景,能更加快速的发现瓶颈,定位瓶颈

对称加密和非对称加密

  1. 对称加密

对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。

常见的对称加密算法:DES,AES,3DES等等。

  1. 非对称加密

非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。

常见的非对称加密算法:RSA,ECC
基于TLS协议的;

使用ECDHE、RSA作为密钥交换算法;

数据传输过程中,加密算法是AES(密钥和初始向量的长度都是256)

你可能感兴趣的:(面试总结)