状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在, eg:输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
1、为什么学习Python?
简单易懂,语言本身简洁,优美,功能超级强大、跨平台、非常火爆的社区、.很多有名的大公司在用,近年来的python用途越来越大,在编程语言的排名中稳步提升,我相信,python必会成为最热门的编程语言之一
2、通过什么途径学习的Python?
通过正规的培训机构学习以及自己买书自学、在网上查找资料、视频
3、Python和Java、PHP、C、C#、C++等其他语言的对比?
⑴作为初学python的科班出身的小白,python非常简单,非常适合人类阅读
⑵易学。python虽然是用c语言写的,但是它摈弃了c中非常复杂的指针,简化了python的语法。
⑶Python是FLOSS(自由/开放源码软件)之一。
⑷可移植性————由于它的开源本质,Python已经被移植在许多平台上
⑸在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。
⑹Python既支持面向过程的函数编程也支持面向对象的抽象编程。
⑺ 可扩展性和可嵌入性。
⑻丰富的库。
⑼ Python确实是一种十分精彩又强大的语言。
(10)书写规范
4、简述解释型和编译型编程语言?
编译型语言:
编译性的语言指使用专门的编译器、针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成该平台硬件执行的机器码
解释型语言:
解释型语言是指使用专门的解释器对源程序进行逐行解释成特定平台的机器码并立即执行的语言。
5、Python解释器种类以及特点?
CPython
当从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解释器:Cpython,这个解释器是用C语言开发的,所以叫CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器虽然外观不同,但内核其实是调用了IE。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术,对Python代码进行动态编译,所以可以显著提高Python代码的执行速度。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
6、位和字节的关系?
1Byte=8bit
7、b、B、KB、MB、GB 的关系?
1GB=1024MB=1024²KB=1024³B=8*1024³b
1MB=1024KB=1024²B=8*1024²b
1KB=1024B=8*1024b
1B=8b
8、请至少列举5个 PEP8 规范(越多越好)。
1、缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2、每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
3、不要在一句import中多个库,比如import os, sys不推荐
4、逗号、冒号、分号前不要加空格。后面加空格
5、总体原则,避免不必要的空格
6、类的方法第一个参数必须是self,而静态方法第一个参数必须是cls
9、通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
print(int("0b1111011",2))
十进制转换成二进制:v = 18
print("转换为二进制为:", bin(18))
八进制转换成十进制:v = “011”
print(int("011",8))
十进制转换成八进制:v = 30
print("转换为八进制为:", oct(30))
十六进制转换成十进制:v = “0x12”
print(int("0x12",16))
十进制转换成十六进制:v = 87
print("转换为十六进制为:", hex(87))
10、请编写一个函数实现将IP地址转换成一个整数。
import socket
import struct
def ip2long(ip):
packedIP = socket.inet_aton(ip)
return struct.unpack("!L", packedIP)[0]
11、python递归的最大层数?
默认最大次数1000,这是python专门设置的一种机制用来防止无限递归造成Python溢出崩溃, 最大递归次数是可以重新调整的
import sys
sys.setrecursionlimit(1500)# set the maximum depth as 1500
12、求结果:
v1 = 1 or 3
1
v2 = 1 and 3
3
v3 = 0 and 2 and 1
0
v4 = 0 and 2 or 1
1
v5 = 0 and 2 or 1 or 4
1
v6 = 0 or Flase and 1
False
13、ascii、unicode、utf-8、gbk 区别?
ASCII码使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。
Unicode能够表示全世界所有的字节
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码
GBK是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。
14、字节码和机器码的区别?
字节码
字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。
字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。
字节码主要为了实现特定软件运行 和软件环境、硬件环境无关
总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
机器码
机器码就是计算机可以直接执行,并且执行速度最快的代码。
用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义
15、三元运算规则以及应用场景?
三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
三元运算符的功能与'if....else'流程语句一致,它在一行中书写,代码非常精炼,执行效率更高
格式:[on_true] if [expression] else [on_false]
res = 值1 if 条件 else 值2
16、列举 Python2和Python3的区别?
1、print
在python2中,print被视为一个语句而不是一个函数,python3中,print()被视为一个函数
2、整数的除法
在python2中,键入的任何不带小数的数字,将被视为整数的编程类型。比如5/2=2,解决方法:5.0/2.0=2.5
在python3中,整数除法变得更直观 5/2=2.5
3、 Unicode
Python 2 默认使用 ASCII 字母表
Python 3 默认使用 Unicode
4、后续发展
Python 2.7 将在 2020 年失去后续的支持,
Python 3 将继续开发更多的功能和修复更多的错误。
17、用一行代码实现数值交换:
a = 1
b = 2
a,b = b,a
18、Python3和Python2中 int 和 long的区别?
int(符号整数):通常被称为是整数或整数,没有小数点的正或负整数
long(长整数):无限大小的整数,这样写整数和一个大写或小写的L
19、xrange和range的区别?
range
函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
xrange
函数说明:xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
1.range和xrange都是在循环中使用,输出结果一样。
2.range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。
3.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。
注意:Python 3.x已经去掉xrange,全部用range代替。
20、文件操作时:xreadlines和readlines的区别?
二者使用时相同,但返回类型不同,xreadlines返回的是一个生成器,readlines返回的是list
21、列举布尔值为False的常见值?
0 , [ ] , " , ( ) , { }
22、字符串、列表、元组、字典每个常用的5个方法?
字符串
words = ‘today is a wonderfulday‘
print(words.strip(‘today‘))#如果strip方法指定一个值的话,那么会去掉这两个值
print(words.count(‘a‘))#统计字符串出现的次数
print(words.index(‘is‘))#找下标
print(words.index(‘z‘))#找下标如果元素不找不到的话,会报错
print(words.find(‘z‘))#找下标,如果元素找不到的话,返回-1
print(words.replace(‘day‘,‘DAY‘))#字符串替换
列表
sample_list = [‘a‘,1,(‘a‘,‘b‘)] #创建列表
sample_list = [‘a‘,‘b‘,0,1,3] # Python 列表操作
value_start = sample_list[0] #得到列表中的某一个值
end_value = sample_list[-1] #得到列表中的某一个值
del sample_list[0] #删除列表的第一个值
sample_list[0:0] = [‘sample value‘] #在列表中插入一个值
元祖
#元组也是一个list,他和list的区别是元组的元素无法修改
tuple1 = (2,3,4,5,6,4,7)
print(type(tuple1))
print(tuple1[:7])
print(tuple1[:5:-1])
for i in range(6):
print(tuple1[i])
for i in tuple1:
print(i)
字典
D.get(key, 0) #同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常
D.has_key(key) #有该键返回TRUE,否则FALSE
D.keys() #返回字典键的列表
D.clear() #清空字典,同del dict
D.copy() #拷贝字典
23、lambda表达式格式以及应用场景?
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
add = lambda x, y : x+y
print(add(1,2)) # 结果为3
应用在函数式编程中 应用在闭包中
24、pass的作用?
1、空语句 do nothing
2、保证格式完整,保证语义完整
3、占位语句
25、*arg和**kwarg作用
*args:可以理解为只有一列的表格,长度不固定。
**kwargs:可以理解为字典,长度也不固定。
1、函数调用里的*arg和**kwarg:
(1)*arg:元组或列表“出现”
**kwarg:字典“出没”
(2)分割参数
2、函数定义时传的*arg /**kwarg:
(1)接收参数
26、is和==的区别
is是对比地址(id),==是对比值
27、简述Python的深浅拷贝以及应用场景?
浅拷贝:copy.copy 深拷贝:copy.deepcopy
浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层
深浅拷贝:
主要应用在字符串,数字的深浅拷贝
28、Python垃圾回收机制?
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通
过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。通过“分代回收”(generation collection)以空间换取时间来进一步提高垃圾回收的效率。
29、Python的可变类型和不可变类型?
Python的每个对象都分为可变和不可变
可变:列表、字典 不可变:数字、字符串、元组
30、求结果:
v = dict.fromkeys(['k1','k2'],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
{'k1': [666], 'k2': [666]}
31、求结果:
def num():
return [lambda x:i*x for i in range(4)]
print([ m(2) for m in num()])
[6, 6, 6, 6]
32、列举常见的内置函数?
1、abs() 此函数返回数字的绝对值。
2、all() 此函数用于判断给定的可迭代参数 iterable 中的所有元素是否都不为 0、都不为False 或者iterable都 为空,如果是返回 True,否则返回 False。
3、bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
4、bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
5、dict() 函数用于创建一个字典。
33、filter、map、reduce的作用?
通俗的说..都是用在一堆数据(比如一个列表)上..
map是用同样方法把所有数据都改成别的..字面意思是映射..比如把列表的每个数都换成其平方..
reduce是用某种方法依次把所有数据丢进去最后得到一个结果..字面意思是化简..比如计算一个列表所有数的和的过程,就是维持一个部分和然后依次把每个数加进去..
filter是筛选出其中满足某个条件的那些数据..字面意思是过滤..比如挑出列表中所有奇数..
34、一行代码实现9*9乘法表
print (‘\n‘.join([‘ ‘.join([‘%s*%s=%-2s‘ % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
35、如何安装第三方模块?以及用过哪些第三方模块?
36、至少列举8个常用模块都有那些
pip、pygame、pyMysql、sys、math、time、os
37、re的match和search区别?
re.match()从开头开始匹配string。
re.search()从anywhere 来匹配string。
38、什么是正则的贪婪匹配?
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配
非贪婪匹配:就是匹配到结果就好,就少的匹配字符
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
39、求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
40、求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
41、def func(a,b=[]) 这种写法有什么坑?
42、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
46、一行代码实现删除列表中重复的值 ?
47、如何在函数中设置一个全局变量 ?
48、logging模块的作用?以及应用场景?
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
49、请用代码简答实现stack 。
50、常用字符串格式化哪几种?
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
52、用Python实现一个二分查找的函数。
53、谈谈你对闭包的理解?
54、os和sys模块的作用?
OS模块是Python标准库中的一个用于访问操作系统功能的模块,使用OS模块中提供的接口,可以实现跨平台访问
sys模块主要是用于提供对python解释器相关的操作
55、如何生成一个随机数?
引入random模块 random.random()
56、如何使用python删除一个文件?
os.remove(path)
57、谈谈你对面向对象的理解?
面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想
在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例
面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息
58、Python面向对象中的继承有什么特点?
继承是进一步将一类事物共有的属性和行为抽象为一个父类,而每一个子类则继承
了父类的行为和属性,也有自己特有的行为和属性。扩展代码,增加复用性
59、面向对象深度优先和广度优先是什么?
60、面向对象中super的作用?
61、是否使用过functools中的函数?其作用是什么?
62、列举面向对象中带爽下划线的特殊方法,如:__new__、__init__
63、如何判断是函数还是方法?
函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用
方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的,表示针对这个对象要做的操作,使用时采用点方法。
64、静态方法和类方法区别?
实例方法,类方法,静态方法都可以通过实例或者类调用,只不过实例方法通过类调用时需要传递实例的引用
三种方法从不同层次上来对方法进行了描述:实例方法针对的是实例,类方法针对的是类,他们都可以继承和重新定义,而静态方法则不能继承,可以认为是全局函数。
65、列举面向对象中的特殊成员以及应用场景
魔术方法 用于在某一时刻调用时
66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数
for x in range(1,5):
for z in range(1,5):
if i != x and i != z and x != z:
print(i,x,z)
67、什么是反射?以及应用场景?
68、metaclass作用?以及应用场景?
69、用尽量多的方法实现单例模式。
70、装饰器的写法以及应用场景。
71、异常处理写法以及如何主动跑出异常(应用场景)
try:
print("123")
expect:
print("456")
通过raise 异常对象主动抛出异常
72、什么是面向对象的mro
Method Realtion Order 用来制作一个继承关系的列表
MRO列表的制作原则:
1、子类永远在父类的前面
2、如果继承了多个父类,那么按照()中的顺序在列表中摆放
3、如果多个类同时继承了一个父类,孙子类中只会选取第一个父类中的父类的该方法
73、isinstance作用以及应用场景?
检测一个数据是否由指定的类型创建
75、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
json.dump(jsonDate,ensure_ascii=False)
77、什么是断言?应用场景?
在没有一个程序之前,我们不知道程序会在哪里出错,与其让它在运行中崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助
python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假
可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
78、有用过with statement吗?它的好处是什么?
with语句的作用是通过某种方式简化异常处理
自动管理文件关闭
79、使用代码实现查看列举目录下的所有文件。
import os
80、简述 yield和yield from关键字。
yield 的作用就是把一个函数变成一个生成器,带有yield的函数不再是一个普通的函数
yield from generator 。实际上就是返回另外一个生成器
yield from 后面可以跟的式子有“ 生成器 元组 列表等可迭代对象以及range()函数产生的序列
==================================第二部分 网络编程和并发(34题)===============================================
1、简述 OSI 七层协议。
自下而上依次为
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
2、什么是C/S和B/S架构?
B/S架构就是给予浏览求的应用程序,网站就是很典型的代表,而通常所说的B/S架构则更是指的是基于网页的系统。
C/S传统程序架构,要有客户端和服务器端,典型的例子QQ就是基于C/S架构的,你本地只是一个客户端,而主程序运行在腾讯的服务器。
3、简述 三次握手、四次挥手的流程。
1、建立连接协议(三次握手)
(1)客户端发送一个带SYN标志的TCP报文到服务器
(2) 服务器端回应客户端的
(3) 客户必须再次回应服务段一个ACK报文
2、连接终止协议(四次挥手)
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
(3) 服务器关闭客户端的连接,发送一个FIN给客户端
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1
4、什么是arp协议?
ARP(Address Resolution Protocol)地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议
5、TCP和UDP的区别?
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流
UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
6、什么是局域网和广域网?
局域网和广域网是按规模大小而划分的两种计算机网络。
局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。
“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。
广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合
通常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以是局域网,也可以是小型的广域网。
7、为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp:TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性
udp:不可靠 一直发数据,不需要对方回应
8、什么是socket?简述基于tcp协议的套接字通信流程。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
服务端:创建socket对象,绑定ip端口bind(), 设置最大链接数listen(), accept()与客户端的connect()创建双向管道, send(), recv(),close()
客户端:创建socket对象,connect()与服务端accept()创建双向管道 , send(), recv(),close()
9、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
粘包:数据粘在一起
主要因为:接收方不知道消息之间的界限,不知道一次性提取多少字节的数据造成的
数据量比较小,时间间隔比较短,就合并成了一个包,这是底层的一个优化算法(Nagle算法)
10、IO多路复用的作用?
I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
11、什么是防火墙以及作用?
简单的来说,防火墙就是一种,避免你的电脑被黑客入侵的一种防护工具,一种确保网络安全的方法!
设置防火墙目的都是为了在内部网与外部网之间设立唯一的通道,简化网络的安全管理。
1、允许网络管理员定义一个中心点来防止非法用户进入内部网络。
2、可以很方便地监视网络的安全性,并报警。
3.可以作为部署NAT(网络地址变换)的地点,利用NAT技术,将有限的IP地址动态或静态地与内部的IP地址对应起来,用来缓解地址空间短缺的问题。
防火墙可以阻止黑客入侵,但不能防止病毒入侵!
12、select、poll、epoll 模型的区别?
13、简述 进程、线程、协程的区别 以及应用场景?
进程拥有自己的堆和栈,既不共享堆也不共享栈 进程由操作系统调度
线程拥有自己的堆和共享的栈 共享栈 但不共享堆 线程也是由操作系统调度
协程和线程一样有自己的堆和共享的栈 共享栈但不共享堆 协程由开发人员在适当情况调用
14、GIL锁是什么鬼?
GIL:Global Interpreter Lock 全局解释器锁
当我们用多线程的时候,每一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL锁,谁即可以用cpu(ps:多个进程有多个Gil锁,但每个进程中只有一个GIL)
15、Python中如何使用线程池和进程池?
进程池:使用multiprocessing.Pool
线程池:使用ThreadPool模块
16、threading.local的作用?
threadLocal解决了参数在一个线程中各个函数之间相互传递的问题
一个threadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本 互不干扰
17、进程之间如何进行通信?
创建一个queue队列,或使用 from multiprocessing import Manage管理要进行通信的数据
18、什么是并发和并行?
并发:指两个或多个事件在同一时间间隔发生
并行:指两个或多个事件在同一时刻发生
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
19、进程锁和线程锁的作用?
进程锁:也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制
线程锁:主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码
当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段
线程锁,进程锁的作用都是一样的,只是作用的范围大小不同。
进程锁——大于——线程锁,能用线程锁的情况下使用进程锁也是可以的
20、解释什么是异步非阻塞?
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。
21、路由器和交换机的区别?
路由器(Router)亦称选径器,是在网络层实现互连的设备。可以连接多个网络或网段的网络设备,包括局域网和广域网。
交换机(Switch)是一种基于MAC(网卡的硬件地址)识别,为始发者和接收者之间建立临时的联网路径。
区别:
1、工作层次不同:交换机比路由器更简单,路由器比交换器能获取更多信息
2、数据转发所依据的对象不同
3、传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域
4、路由器提供了防火墙的服务
22、什么是域名解析?
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务
23、如何修改本地hosts文件?
记事本打开C:\Windows\System32\drivers\etc下的hosts文件进行修改
24、生产者消费者模型应用场景及优势?
应用于一个生产数据一个处理数据的场景
优势生产者和消费者之间不直接进行通信 而是通过一个队列相当于一个缓冲区,平衡了生产者和消费者的处理能力
25、什么是cdn?
CDN的全称是Content Delivery Network,即内容分发网络。
其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
26、LVS是什么及作用?
27、Nginx是什么及作用?
Nginx是一个http服务器
1、 http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、 虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。基于端口的,不同的端口基于域名的,不同域名
3、 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。
并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
28、keepalived是什么及作用?
29、haproxy是什么以及作用?
30、什么是负载均衡?
负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台
然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。
31、什么是rpc及应用场景?
32、简述 asynio模块的作用和应用场景。
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。
asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
33、简述 gevent模块的作用和应用场景。
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。
由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:
34、twisted框架的使用和应用?
Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。
就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点,Twisted对于其支持的所有协议都带有客户端和服务器实现,
同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。
=========================================第三部分 数据库和缓存(46题)=====================================================
1、列举常见的关系型数据库和非关系型都有那些?
关系型:Mysql / Oracle / SQL Server
非关系型:redis / MongoDB…
2、MySQL常见数据库引擎及比较?
MySQL数据库中的表引擎一般常用两种:MyISAM和InnoDB
区别:
MyISAM类型的数据文件有三个1.frm(结构)、2.MYD(数据)、3.MYI(索引)
MyISAM类型中的表数据增 删 改速度快,不支持事务,没有InnoDB安全。
InnoDB类型的数据文件只有一个 .frm
InnoDB类型的表数据增 删 改速度没有MyISAM的快,但支持事务,相对安全
3、简述数据三大范式?
1、每一列只有一个值
2、每一行都能区分。
3、每一个表都不包含其他表已经包含的非主关键字信息。
4、什么是事务?MySQL如何支持事务?
同时对一组数据进行操作的语句就成为事务
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
5、简述数据库设计中一对多和多对多的应用场景?
6、如何基于数据库实现商城商品计数器?
设置一个商品计数的列 自动递增为1(auto_increment)
7、常见SQL(必备)
详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8、简述触发器、函数、视图、存储过程?
触发器:制定一个sql条件和要做的事当满足的时候自动触发并执行要做的事
函数(存储过程):Mysql储存过程简而言之就是一组已经好的命令,需要使用的时候拿出来用就可以
视图:将一个写好的查询语句封装起来 当调用的时看到的数据就是满足条件的数据 不用每次都写同样的代码
9、MySQL索引种类
1、唯一索引:create unique index
2、主键索引:primary key
3、普通索引:create index on Tablename(列的列表)
4、全文索引:FULLTEXT
10、索引在什么情况下遵循最左前缀的规则?
11、主键和外键的区别?
1、主键,唯一标识一条记录,不能重复,不允许为空;外键,表的外键是另一表的主键,外键可以重复,可以是空值
2、主键,用来保证数据完整性;外键,用来和其他表建立联系
3、主键只能有一个;一个表可以有多个外键
12、MySQL常见的函数?
concat(s1,s2,…Sn) 连接s1,s2..Sn为一个字符串
length(str) 返回值为字符串str 的长度
datediff(expr,expr2) 返回起始时间和结束时间的间隔天数
13、列举 创建索引但是无法命中索引的8种情况。
14、如何开启慢日志查询?
15、数据库导入导出命令(结构+数据)?
导出:
mysqldump -u root -p 库名 导出的文件.sql
导入:
mysql -u root -p 库名
16、数据库优化方案?
为经常查询的字段添加索引
减少外键关联查询
17、char和varchar的区别?
1、char的长度是固定的,而varchar的长度是可变的
2、CHAR的效率比VARCHAR2的效率稍高
3、CHAR(10)若输入数据的字符数小于10,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
VARCHAR(10)数据类型的存储长度为实际数值长度。
18、简述MySQL的执行计划?
数据库的执行计划通俗点说就是,数据库服务器在执行sql语句的时候,会准备几套方案,最后选择消耗资源最小的那个方案。就是执行计划。
19、在对name做了唯一索引前提下,简述以下区别:
select * from tb where name = ‘Oldboy-Wupeiqi’
select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1
第一条语句会查询所有 name = 'Oldboy-Wupeiqi'的数据
第二条语句只会查询第一个符合 name = 'Oldboy-Wupeiqi'的数据
20、1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?
当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢
可以通过 增加order by,并且order by字段需要建立索引。
21、什么是索引合并?
1、索引合并是把几个索引的范围扫描合并成一个索引。
2、索引合并的时候,会对索引进行交集,交集或者先交集再并集操作,以便合并成一个索引
3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并
22、什么是覆盖索引?
覆盖索引指,select的数据列只用从索引中就能取得,不必从数据表中读取,也就是说查询要被所使用的索引覆盖
23、简述数据库读写分离?
对于数据存储层高并发问题,最先想到的可能就是读写分离,在网站访问量大并且读写不平均的情况下,将存储分为
master,slave两台,所有的写都路由到master上,所有的读都路由到slave上,然后master和slave同步。如果一台slave不够,
可以加多台,比如一台master,3台slave
24、简述数据库分库分表?(水平、垂直)
常见的分库方式有水平性和垂直性。一般来说,就是按照用户属性(城市或者ID的hash)进行分库,或者按照业务功能进行分库
水平分库方式主要根据用户属性(如城市)拆分物理数据库,一种常见的方式是将全省划分为各大区
垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。例如,将一些
公用的配置信息存储到一个数据库中进行单独维护
25、redis和memcached比较?
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
5、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复.
26、redis中数据库默认是多少个db 及作用?
redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。redis配置文件中下面的参数来控制数据库总数:
/etc/redis/redis.conf
文件中,有个配置项 databases = 16 //默认有16个数据库
27、python操作redis的模块?
r = redis.Redis(host="192.168.0.0", port=6379)
r.set("name", "ok")
print(r.get("name"))
28、如果redis中的某个列表中的数据量非常大,如何实现循环显示每一个值?
查询取出列表的值让后使用python循环
29、redis如何实现主从复制?以及数据同步机制?
在Master和Slave互通之后,首先,Slave会发送sync同步指令,当Master收到指令后,将在后台启动存盘进程,
同时收集所有来自Slave的修改数据集的指令信息,当后台进程完成之后,Master将发送对应的数据库文件到对应的Slave中,以完成一次完整的同步工作。
其次Slave在接受到数据库文件之后,将其存盘并加载到内存中。最后,Master继续收集修改命令和新增的修改指令,
并依次发送给Slave,其将在本次执行这些数据的修改命令,从而最终达到数据同步的实现。
30、redis中的sentinel的作用?
Redis Sentinel 为Redis提供了高可用的实现。通俗来说就是你可以部署一套无需人为干预即可防灾的Redis环境。
RS同时为客户端提供了其他诸如监控,通知的功能。
31、如何实现redis集群?
官方cluster方案 =====> twemproxy代理方案 =====> 哨兵模式 =====> codis =====> 客户端分片
32、redis中默认有多少个哈希槽?
有2的14次方个哈希槽 16384个
33、简述redis的有哪几种持久化策略及比较?
rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略
aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合
34、列举redis支持的过期策略。
定时删除
在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
惰性删除
key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
定期删除
每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作
35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
LRU(最近少用的淘汰)
即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).
一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了.
36、写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。
先进lpush keys values 先出 rpop keys
先进lpush keys values 后出 lpop keys