说一下你对面向对象的理解
面向对象就是:是软件开发方法,一种编程范式,把数据及对数据的操作方法放在一起,作为一个相互依存的整体
面向对象的五大原则是什么
单一职责原则(Single-Resposibility Principle):
一个类,最好只做一件事,只有一个引起它的变化的原因。
开放封闭原则(Open-Closed principle)
软件实体应该是可扩展的,而不可修改的。
里氏代换原则(LSP:Liskov Substitution Principle)
所有使用基类的地方必须能够透明的使用其子类的对象
依赖倒置原则(Dependecy-Inversion Principle)
高层模块不依赖于底层模块,二者都同依赖于抽象
接口隔离原则(Interface-Segregation Principl
使用多个小的专门的接口,而不要使用一个大的总接口。
线程 进程 和协程的区别
进程和线程可以拥有多个协程,线程进程都是同步机制,而协程则是异步。
线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
TCP与UDP区别总结:
TCP面向连接; TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达
UDP是无连接的,UDP尽最大努力交付,即不保证可靠交付,具有较好的实时性,工作效率比TCP高,UDP对系统资源要求较少
死锁是如何造成的,怎么避免
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
1.查询是否锁表,查询进程,结束进程id
2:查看当前的事务,查看当前锁定的事务,查看当前等锁的事务,结束进程id
装饰器的作用及应用场景
1.装饰器的实现是由闭包支撑的;
2.装饰器本质上是⼀个python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能;
3用于flask,可以作为flask的路由
Python是如何做内存管理的
1.引用计数:赋值 计数器+1,删除-1
2.垃圾回收:解决对象的循环引用,引用计数无法解决时
3.内存池机制:将不用的内存放到内存池,不反还给操作系统
什么是递归
递归,就是在运行的过程中调用自己,但绝对有一个能跳出去的条件。
python的高阶函数
python内置的四大高阶函数为map,reduce,filter,sorted
map: 接收两个参数,一个是函数,一个是序列,将序列里所有数据都经过函数的作用然后返回到序列
reduce::接收两个参数,一个是函数,一个是序列,像斐波那契一样将序列经过函数的作用然后最终返回一个值
filter:接收两个参数,一个是函数,一个是序列,将序列经过函数的作用函数返回True或False
将返回True的数据放到新列表中
sorted函数:sorted() 函数对所有可迭代的对象进行排序操作
global和nonlocal
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误
列举python中的魔法方法
init方法是在对象的初始化时候使用的,不同于C++中的对象中直接定义,python对象中的初始化需要在这个魔法方法中来定义
str方法控制的是使用print函数打印这个类的对象的时候所表现的形式
__cmp__操作符,也是载入两个对象self和other,重载的是==比较符,当第一个对象比第二个大的时候返回正数,当第二个对象大的时候返回负数,相等时返回0。
getattr、__setattr__方法
可以获取或者设置属性
静态方法类方法的区别
类方法和静态方法的区别在于,Python会自动绑定类方法的第一个参数,类方法的第一个参数(通常建议参数名为 cls)会自动绑定到类本身;但对于静态方法则不会自动绑定。
什么是元类
type是内置的一个元类,所有的类都是由type实例化得到的
产生类的类叫做元类
什么是反射
需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未知的方法或变量,这中机制就称之为反射
什么是IO多路复用
Io多路复用
Io概念
IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作,没有文件句柄就绪就会阻塞应用程序,交出CPU。
多路是指网络连接,复用指的是同一个线程
select、poll、epoll特点是什么
select概念
select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
poll概念
poll本质上和select没有区别,但是它没有最大连接数的限制
epoll概念
epoll会把哪个流发生了怎样的I/O事件通知我们
什么是生产者消费者模型
生产者消费者模型是什么
生产者消费者模型属于架构设计,类似于我们所说的设计模式,用于解决生产者和消费者速率不匹配的问题这一类问题,架构设计上使得消费者生产者解耦。
mysql常用 的数据库引擎
InnoDB 支持事务、外键、行锁
MyISAM 支持表锁,访问快
Memory 存在内存中
myISAM和Innodb的区别是什么
区别
事务安全(MyISAM不支持事务,INNODB支持事务)
外键 MyISAM 不支持外键, INNODB支持外键.
锁机制(MyISAM时表锁,innodb是行锁)
查询和添加速度(MyISAM批量插入速度快)
支持全文索引(MyISAM支持全文索引,INNODB不支持全文索引)
MyISAM内存空间使用率比InnoDB低
Memory 存储,比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快. (如果mysql重启的话,数据就不存在了)
hash索引和btree的区别
hash:用链表形式存储,检索的时候可以一次到位,但如果发生hash碰撞
(两个不同关键字的Hash值相同)则需要在取值时进行筛选
btree:用树状形式存储,检索速度比hash检索慢但不会发生问题
索引的作用和类型
索引用于快速在某一列中找到特定的值,
索引分类
普通索引: 仅加速查询
唯一索引: 加速查询 + 列值唯一 (可以有 null)
主键索引: 加速查询 + 列值唯一 (不可以有null) + 表中只有一个
组合索引: 多列值组成一个索引, 专门用于组合搜索, 其效率大于索引合并
全文索引: 对文本的内容进行分词, 进行搜索
索引失效的原因有哪些或什么情况下用不到索引
mysql索引失效的几种情况:1、条件中有or,即使其中有条件带索引也不会使用;2、对于多列索引,不使用的第一部分,则不会使用索引;3、like查询以%开头,索引无效;4、当字段类型为字符串时,条件中数据没有使用引号引用。
什么情况下不建议用索引
建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立。
如果表是经常需要更新的也不适合做索引。频繁更新会导致索引也会频繁更新,降低写的效率。
where 语句里面如果带有or条件尽量不要使用or语句来查询
如果数据表过大不适合作为索引。查询大量数据时,索引有效,但是慢。
in/not in使用不到索引,因为in查询时会进行多次全表查询;
数据库事务
原子性(Atomicity);指事务是一个不可分割的单元,事务中的操作要么全部执行,要么全部不执行。
一致性(Consistency);事务执行前后数据的完整性必须保持一致。
隔离性(Isolation);多个用户并发访问数据库时,数据库为每一个用户开启一个事务,多个事务并发执行时,相互之间是隔离开的,互不影响。
持久性(Durability);事务一旦被提交,对数据库中数据的改变是永久性性的。
.事务的隔离级别有哪些
MySQL事务隔离级别
读已提交(read-committed)
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
说一下mysql中的锁
悲观锁
可以完全保证数据的独占性和正确性,因为每次请求都会先对数据进行加锁所以性能不高;
乐观锁
只有在更新数据的时候才会检查这条数据是否被其他线程更新了数据操作的性能高
共享锁(读锁)
是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改直到已释放所有共享锁。加上共享锁后,对于update,insert,delete语句会自动加排它锁。
排它锁(写锁)
排它锁会阻塞所有的排它锁和共享锁
读取为什么要加读锁呢:防止数据在被读取的时候被别的线程加上写锁,
什么是sql注入
SQL 注入其实就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常 规代码的过程。
常用的请求方式有哪些
常见的响应码
1xx(临时响应)
100: 请求者应当继续提出请求。
101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。
2xx(成功)
200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200。
201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。
202:请求是正确的,但是结果正在处理中这时候客户端可以通过轮询等机制继续请求。
3xx(已重定向)
300:请求成功,但结果有多种选择。
301:请求成功,但是资源被永久转移。比如说,我们下载的东西不在这个地址需要去到新的地址。
4xx(请求错误)
401:没有提供认证信息。请求的时候没有带上 Token 等。
404:请求的内容不存在。
5xx(服务器错误)
500:服务器错误。
501:请求还没有被实现。
502:网关错误。
503:服务暂时不可用。服务器正好在更新代码重启。
505:请求的 HTTP 版本不支持。
redis持久化的方式
Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件):
RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。
AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议一致,以追加的方式进行保存。
http和https的区别
http 明文传输 数据都是未加密的 安全性较差 用的端口是 80
https 数据传输过程是加密的 安全性较好 用的端口是 443
http 页面响应速度比 https 快 https 比 http 要更耗费服务器资源。
缓存穿透
概念:访问一个不存在的key,缓存不起作用
解决:将查到的空值写进缓存,设置较短过期时间
缓存雪崩
概念:大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效
解决:缓存过期时间加上一个随机值
缓存击穿
概念:一个存在的key,在缓存过期的一刻,有大量请求
解决:SETNX设置一个短期key锁住当前key的访问,过期后使用单个线程重建缓存。