面试题集锦

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
posted @ 2022-07-08 08:50  马氵寿  阅读(34)  评论(0编辑  收藏  举报