面试题集锦
nginx是什么,有什么作用, uwsgi是什么有什么作用?
nginx和uwsgi的区别和作用:
1, nginx是对外的服务器,外部浏览器通过url访问nginx, uwsgi是对内的服务器,主要用来处理动态请求。
2, nginx接收到浏览器发送过来的http请求,将包进行解析,分析url, a.如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件, b.如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,
uwsgi接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,
wsgi根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将
返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,
uwsgi接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。
cgi fastcig WSGI uwsgi uWSGI
# cgi:通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。
一句话总结: 一个标准,定义了客户端服务器之间如何传数据
# fastcig:快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本
一句话总结: CGI的升级版
常用的fastcgi软件:
Apache HTTP Server (部分)
Nginx(主流):nginx是一个符合fastcgi协议的软件,处于浏览器和web程序之间,主要做请求转发和负载均衡,也可以称之为服务器中间件
Microsoft IIS
# WSGI:Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口
一句话总结: 为Python定义的web服务器和web框架之间的接口标准
wsgiref:性能很低,python实现的,djgno内置了,测试阶段用,上线不用
uWSIG:性能高,c实现的
gunicorn:python实现的
# uWSGI: 符合wsgi协议的web服务器,上面标准的具体实现
# uwsgi:uWSGI服务器,自有协议
什么是接口幂等性,如何处理幂等性?
-幂等性:多次操作的效果跟一次操作是一样的
-多次调用接口,跟调用一次效果一样
-哪些接口天然就是幂等性的?
-get
-put
-delete
-post新增数据,不是接口幂等的,对不符合幂等性的接口,进行处理
-如何解决:
-方式一:通过唯一字段解决,像注册接口,让用户名唯一
-方式二:前端点击以后,按钮失效,只能点一次
-方式三:(主流)token机制
1、哪些接口存在幂等问题的,就必须在执行业务前,先去获取token,服务器会把token保存到redis中。
2、然后调用业务接口请求时,把token携带过去,一般放在请求头部。
3、服务器判断token是否存在redis中,存在表示第一次请求,然后删除token,继续执行业务。
4、如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业务代码,不被重复执行
Apache指什么?
-Apache 公司
-Apache web服务器
-Apache 开源协议
-Kafka :apache顶级开源项目
-echars:原来是百度开发的,交给了apache孵化
中间件的概念
-介于a和b之间的东西都称之为中间件
-服务器中间件:nginx,apache
-数据库中间件:介于应用程序和数据库之前的, MyCat
-消息队列中间件:kafka,rabbitmq,Rocketmq
浏览器输入一个地址到请求返回,经历的过程
-1 输入域名,敲回车,向这个域名的80端口,发送了一个get请求
-2 把域名通过域名解析(dns解析),解析出真正的地址 101.133.225.166
-dns解析:先解析本地host文件,为全网用户提供域名的公共递归解析服务,全球13个根dns服务器,如果还找不到,就报错
-3 客户端跟服务器建立链接
-走的是http协议---(请求协议,响应协议)
-但是http协议底层基于TCP,三次握手,就开始可靠传输数据
-4 假设咱们后端是python的django框架 :中间件,路由匹配,视图函数,取数据,拿模板渲染模板,把模板的数据,放到http响应的响应体中,通过http响应返回给客户端
-5 浏览器拿到了http的响应,把响应头的东西,放到浏览器中,响应体的数据,显示在浏览器上,就看到了数据了
有哪些开源许可,规定是什么
-GPL:
-Apache
python可变与不可变类型,值传递和引用传递?
##### python的可变与不可变
python 可变与不可变 ----》只有python中这么叫 ----》其他语言叫值类型和引用类型
# 内存优化机制----》如果比较短的字符串 或者是一些数字(小整数池) 如果定义多份其实用的都是同一个
# s1='lqz is handsome'
# s2='lqz is handsome'
# s2='sss'
# print(s1 is s2)
# 字典的key值要可hash,不可变数据类型可以hash
##### python是值传递还是引用传递?
python 中没有值和引用的叫法,因为python一切皆对象,所有按理来说,python中一切都是引用;
所以参数传递按理来说也应是引用传递,但是python中区分可变和不可变类型;
如果是可变类型传递,函数中修改会影响原来的,如果是不可变类型传递,在函数中修改不会影响原来的;
深拷贝和浅拷贝
浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用(可变类型是引用,不可变类型是新的)
深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联
__new__和__init__的区别
__new__ 对象的创建会调用它,一定返回一个值,这个值就是对象本身
__init__ 初始化对象调用它,一般我们往对象中放属性
__new__在__init__前执行
面向对象类型及魔法方法
# 类型判断
-issubclass:帮我们判断x类是否是y类型的子类
class Base:
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar, Foo)) # True
print(issubclass(Foo, Bar)) # False
print(issubclass(Bar, Base)) # True
-isinstance:可以判断x是否是y类的对象,isinstance可以判断该对象是否是家族体系中的(只能往上判断类)
class Base:
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(isinstance(Foo(), Foo)) # True
print(isinstance(Foo(), Base)) # True
print(isinstance(Foo(), Bar)) # False
-type:它是一个类,表示查看obj是由哪个类创建的
# importlib
from xx.yy import zz
'xx.yy.zz'
目录结构:
├── aaa.py
├── bbb.py
└── mypackage
├── __init__.py
└── xxx.py
# bbb.py
import importlib
func = importlib.import_module('aaa')
print(func)
func.f1()
m = importlib.import_module('mypackage.xxx')
print(m.age)
# 魔法方法
# 1 __str__:改变对象的字符串显示。可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法
# 2 __repr__:在python解释器环境下,会默认显示对象的repr表示
str函数或者print函数调用的是obj.__str__()
repr函数或者交互式解释器调用的是obj.__repr__()
注意:
如果__str__没有被定义,那么就会使用__repr__来代替输出。
__str__和__repr__方法的返回值都必须是字符串。
# 3 __format__:使用format内置函数调用对象时,出发 format(对象,字符串)
# 4 __del__ 析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
# 5 __dict__
Python中的类,都会从object里继承一个__dict__属性,这个属性中存放着类的属性和方法对应的键值对。一个类实例化之后,这个类的实例也具有这么一个__dict__属性。但是二者并不相同
# 6 __slots__:类中使用了它,对象只能打印和使用__slots__中声明的属性
# 7__item__系列 对象[] 操作会触发
__getitem__ 对象['属性']取值会触发它的执行
__setitem__ 对象['属性']=值 触发
__delitem__ del 对象['属性'] 触发
# 8 __init__:对象在初始化时调用
# 9 __new__ :创建对象,在init之前执行
# 10 __call__: 对象() 会触发它
# 11 __doc__ 定义类的描述信息。注意该信息无法被继承
# 12 __iter__和__next__
如果一个对象拥有了__iter__和__next__方法,那这个对象就是可迭代对象
# 13 __enter__和__exit__
一个对象如果实现了__enter__和___exit__方法,那么这个对象就支持上下文管理协议,即with语句
with 类型()触发__enter__执行
不在缩进中了,会执行__exit__
with 类型() as xx:
pass
# 14 __len__ :内置函数 len(对象触发)
# 15 __hash__
拥有__hash__方法的对象支持hash(obj)操作‘
# 16 __eq__
拥有__eq__方法的对象支持相等的比较操作
redis key值最大可以多大?
key:512M
value:512M
事务四个特性
-原子性(Atomicity):数据库把“要么全做,要么全不做”的这种规则称为原子性
-隔离性(Isolation):事务之间相互隔离,不受影响,这与事务的隔离级别密切相关
-一致性(Consistency):事务执行前后的状态要一致,可理解为数据一致性
-持久性(Durable):事务完成之后,它对数据的修改是永恒的,即时出现故障也能够正常保持
如果不考虑事务的隔离性,会导致什么问题?
# 脏写(Dirty Write)
如果一个事务修改了另一个事务提交修改过的数据,就意味着发生了脏写现象。
# 脏读(Dirty Read)
如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读现象。
# 不可重复读
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象。
# 幻读
如果一个事务先根据某些查询条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些收缩条件的记录(这里指INSERT,DELETE,UPDATE 操作),就以为着发生了幻读现象
事务隔离级别
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
-READ UNCOMMITTED:未提交读(读未提交)
-READ COMMITTED:已提交读(读已提交)
-REPEATABLE READ:可重复读
-SERIALIZABLE:可串行化
mysql 5.7 的默认隔离级别是多少?
# MySQL默认隔离级别:
RR:Repeatable read(可重复读取)
# mysql的4种事务隔离级别,如下所示:
1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
2、提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
3、可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读
4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
https://developer.aliyun.com/article/743691#slide-10
浙公网安备 33010602011771号