海口网站开发公司,简易蜘蛛池网站开发,商业公司的域名,中企动力网站合同前言
前几天在网上发了腾讯面试官问的一些问题#xff0c;好多小伙伴关注#xff0c;今天对这些问题写个具体答案#xff0c;博主好久没看八股了#xff0c;正好复习一下。
面试手撕了三道算法#xff0c;这部分之后更#xff0c;喜欢的小伙伴可以留意一下我的账号。 1…前言
前几天在网上发了腾讯面试官问的一些问题好多小伙伴关注今天对这些问题写个具体答案博主好久没看八股了正好复习一下。
面试手撕了三道算法这部分之后更喜欢的小伙伴可以留意一下我的账号。 1.讲一下数据库的事物特性和底层原理
四大特性
⑴ 原子性Atomicity 原子性是指事务包含的所有操作要么全部成功要么全部失败回滚这和前面两篇博客介绍事务的功能是一样的概念因此事务的操作如果成功就必须要完全应用到数据库如果操作失败则不能对数据库有任何影响。
⑵ 一致性Consistency 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态也就是说一个事务执行之前和执行之后都必须处于一致性状态。 转账来说假设用户A和用户B两者的钱加起来一共是5000那么不管A和B之间如何转账转几次账事务结束后两个用户的钱相加起来应该还得是5000这就是事务的一致性。
⑶ 隔离性Isolation 隔离性是当多个用户并发访问数据库时比如操作同一张表时数据库为每一个用户开启的事务不能被其他事务的操作所干扰多个并发事务之间要相互隔离。 即要达到这么一种效果对于任意两个并发的事务T1和T2在事务T1看来T2要么在T1开始之前就已经结束要么在T1结束之后才开始这样每个事务都感觉不到有其他事务在并发地执行。
⑷ 持久性Durability 持久性是指一个事务一旦被提交了那么对数据库中的数据的改变就是永久性的即便是在数
原理
数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
并发控制技术
并发控制技术是实现事务隔离性以及不同隔离级别的关键,实现方式有很多,按照其对可能冲突的操作采取的不同策略可以分为乐观并发控制和悲观并发控制两大类。 乐观并发控制:对于并发执行可能冲突的操作,假定其不会真的冲突,允许并发执行,直到真正发生冲突时才去解决冲突,比如让事务回滚。 悲观并发控制:对于并发执行可能冲突的操作,假定其必定发生冲突,通过让事务等待(锁)或者中止(时间戳排序)的方式使并行的操作串行执行。
我们这里介绍基于悲观锁的机制
核心思想:对于并发可能冲突的操作,比如读-写,写-读,写-写,通过锁使它们互斥执行。 锁通常分为共享锁和排他锁两种类型
1.共享锁(S):事务T对数据A加共享锁,其他事务只能对A加共享锁但不能加排他锁。2.排他锁(X):事务T对数据A加排他锁,其他事务对A既不能加共享锁也不能加排他锁
基于锁的并发控制流程: 事务根据自己对数据项进行的操作类型申请相应的锁(读申请共享锁,写申请排他锁) 申请锁的请求被发送给锁管理器。锁管理器根据当前数据项是否已经有锁以及申请的和持有的锁是否冲突决定是否为该请求授予锁。 若锁被授予,则申请锁的事务可以继续执行;若被拒绝,则申请锁的事务将进行等待,直到锁被其他事务释放。
可能出现的问题: 死锁:多个事务持有锁并互相循环等待其他事务的锁导致所有事务都无法继续执行。 饥饿:数据项A一直被加共享锁,导致事务一直无法获取A的排他锁。
对于可能发生冲突的并发操作,锁使它们由并行变为串行执行,是一种悲观的并发控制。
日志恢复技术
日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。 撤销事务undo:将事务更新的所有数据项恢复为日志中的旧值 重做事务redo:将事务更新的所有数据项恢复为日志中的新值。 2.讲一下数据库的隔离级别
① Serializable (串行化)可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读)可避免脏读、不可重复读的发生。
③ Read committed (读已提交)可避免脏读的发生。
④ Read uncommitted (读未提交)最低级别任何情况都无法保证。 3.讲一下数据库的的索引机制
索引index是帮助MySQL高效获取数据的数据结构(有序)提高数据检索的效率降低数据库的IO成本不需要全表扫描通过索引列对数据进行排序降低数据排序的成本降低了CPU的消耗。
MySQL的InnoDB引擎采用的B树的数据结构来存储索引b树阶数更多路径更短磁盘读写代价B树更低非叶子节点只存储指针叶子阶段存储数据B树便于扫库和区间查询叶子节点是一个双向链表 4.说一下Redis和MySQL数据同步的方案
延时双删策略
在写库前后都进行redis.del(key)操作并且设定合理的超时时间。 为什么在写入之后还要删除
因为写入之前可以有读请求读到了未修正的数据然后写入了缓存这个时候缓存和真实数据不一致但是读请求只会读到缓存就返回数据造成数据更新不及时
异步更新缓存(基于订阅binlog的同步机制)
MySQL binlog增量订阅消费消息队列增量数据更新到redis
读Redis热数据基本都在Redis写MySQL:增删改都是操作MySQL更新Redis数据MySQ的数据操作binlog来更新到Redis 5.讲一下向某个网站从发送请求到收到数据这个过程中发生了什么。
1.浏览器中输入网址。
2.通过DNS解析域名的实际IP地址
DNS 解析首先会从你的浏览器的缓存中去寻找是否有这个网址对应的 IP 地址如果没有就向OS系统的 DNS 缓存中寻找如果没有就是路由器的 DNS 缓存 如果没有就是 ISP 的DNS 缓存中寻找。
3.与 WEB 服务器建立 TCP 连接。
TCP 协议通过三次握手建立连接。
客户端通过 SYN 报文段发送连接请求确定服务端是否开启端口准备连接。状态设置为 SYN_SEND;服务器如果有开着的端口并且决定接受连接就会返回一个 SYNACK 报文段给客户端状态设置为 SYN_RECV客户端收到服务器的 SYNACK 报文段向服务器发送 ACK 报文段表示确认。此时客户端和服务器都设置为 ESTABLISHED 状态。连接建立可以开始数据传输了。
4.若协议是https则会做加密
5.浏览器发送请求获取页面html
6.服务器响应html
7.浏览器解析 HTML
8.浏览器渲染页面 6.讲一下进程与线程的区别以及你对操作系统的理解
进程是对运行时程序的封装是系统进行资源调度和分配的的基本单位实现了操作系统的并发
线程是进程的子任务是CPU调度和分派的基本单位用于保证程序的实时性实现进程内部的并发线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器独自的寄存器组指令计数器和处理器状态。每个线程完成不同的任务但是共享同一地址空间也就是同样的动态内存映射文件目标代码等等打开的文件队列和其他内核资源。
7.线程如何数据交互进程如何数据交互?
线程的数据交互
锁机制包括互斥锁、条件变量、读写锁
互斥锁提供了以排他方式防止数据结构被并发修改的方法。读写锁允许多个线程同时读共享数据而对写操作是互斥的。条件变量可以以原子的方式阻塞进程直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore)包括无名线程信号量和命名线程信号量
信号机制(Signal)类似进程间的信号处理 进程的数据交互
管道( pipe )
管道是一种半双工的通信方式数据只能单向流动而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道 (namedpipe)
有名管道也是半双工的通信方式但是它允许无亲缘关系进程间的通信。 信号量(semophore )
信号量是一个计数器可以用来控制多个进程对共享资源的访问。它常作为一种锁机制防止某进程正在访问共享资源时其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。 消息队列( messagequeue )
消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 信号 (sinal )
信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。 共享内存(shared memory )
共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建但多个进程都可以访问。共享内存是最快的 IPC 方式它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制如信号两配合使用来实现进程间的同步和通信。 套接字(socket )
套接口也是一种进程间通信机制与其他通信机制不同的是它可用于不同设备及其间的进程通信。