python后端面试

面试题如下

笔者在7月份遇到的面试题如下

1. 二分查找/算法原理/数据结构

二分查找法
key_num
list

def binary_search(key_num,list) 
    mid=len(list)/2
    if list[mid] > key_num:
         binary_search(key_mun,list[:mid])
    elif list[mid] < key_num:
         binary_search(key_mun,list[:mid])
    else:
         print(binary_search[mid])

2. mongodb 面试题

mongo 是非关系行的数据库(nosql)
1.mongo 无复杂性的锁以及事物出理方面的操作
2. 在collection中,数据库名+集合名叫做名字空间。也就是一个集合的完整名

3.mongodb的结构介绍
数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成

4 .数据库的整体结构
键值对–》文档–》集合–》数据库

5. 分析器在MongoDB中的作用是什么?
MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。

6. MongoDB支持存储过程吗?如果支持的话,怎么用?
MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。

7.MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?

  不会,只会在A:{B,C}上使用索引。
10.如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

  如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。

适用场合:

网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

3. redis面试题

  • 用处(缓存/队列 包括Pub、Sub/计数器/排行榜等)
  • 基本操作与数据类型
  • 消息队列 且与其它消息队列的区别
  • 主从备份
  • 宕机如何处理
  • 持久化及原理(原生持久化 & 结合Mysql等数据库持久化)
  • 是否可以作为数据库?作为数据库有哪些问题?
  • 集群化
  • 数据超过内存如何处理
  • 事务与分布式锁机制
  • 缓存失效策略
  • 其它

redis 一般用来做缓存 读写性好且能做读写分离同时支持多种类型 如 list dict sootedset(可做实时的排序 如游戏的实时分数更新) hash
redis 支持事务性的操作

1.redis常见性能问题和解决方案:   

   1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

   2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久

    化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

   3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

   4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

2. mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

  • redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:
  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

3.Redis是单进程单线程的

  • redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

4.redis 最适合的场景  
- (1)会话缓存(Session Cache)
- (2)全页缓存(FPC)

  token

  • (3)队列

    list

  • (4)排行榜/计数器

    sorted set

  • (5)发布/订阅
    抖音的发布 点赞等
      最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

5.redis 持久化  
做快照

6.redis 主从哨兵设置  
设置主从 以防数据丢失

4. 大数据并发处理

找出 重复次数最多的电话号码
    思路:1.将电话列表进行桶排序 
                2.拿到桶  [0,1,0,0,5,3]
        list= [1,4,3,5,2]
        buket=[0]*(max(list)+1)
        for i in list:
            buket[i]+=1

        new_list=[]
         for k in range(len(buket)):
            if buket[k] != 0:
                for j in range(buket[k]):
                    new_list.append(k)

                    启用numpy 进行数据比较
                    import numpy as np
                        a=np.array([buket])
                        b=np.argsort(a)
        print (b)    [0 4 2 1 3]   说明 a[3]是最大的 a[0] 是最小值

迭代器的引入,readlines 进程池 多线程及携程

4. 交换,路由 网关 内外网

交换&路由
- 交换机主要是用于组建局域网,而路由器则是负责让主机连接外网
- 最初的交换机工作在OSI开放式系统互联模型的数据链路层,也就是第二层,而路由器则工作在OSI模型的网络层。
- 交换机是根据MAC地址转发数据帧,而路由器则是根据IP地址来转发IP数据报/分组

为了简单地说明路由器的工作原理,现在我们假设有这样一个简单的网络。如图所示,A、B、C、D四个网络通过路由器连接在一起。
现在我们来看一下在如图所示网络环境下路由器又是如何发挥其路由、数据转发作用的。现假设网络A中一个用户A1要向C网络中的C3用户发送一个请求信号时,信号传递的步骤如下:
第1步:用户A1将目的用户C3的地址C3,连同数据信息以数据帧的形式通过集线器或交换机以广播的形式发送给同一网络中的所有节点,当路由器A5端口侦听到这个地址后,分析得知所发目的节点不是本网段的,需要路由转发,就把数据帧接收下来。
第2步:路由器A5端口接收到用户A1的数据帧后,先从报头中取出目的用户C3的IP地址,并根据路由表计算出发往用户C3的最佳路径。因为从分析得知到 C3的网络ID号与路由器的C5网络ID号相同,所以由路由器的A5端口直接发向路由器的C5端口应是信号传递的最佳途经。
第3步:路由器的C5端口再次取出目的用户C3的IP地址,找出C3的IP地址中的主机ID号,如果在网络中有交换机则可先发给交换机,由交换机根据 MAC地址表找出具体的网络节点位置;如果没有交换机设备则根据其IP地址中的主机ID直接把数据帧发送给用户C3,这样一个完整的数据通信转发过程也完成了。

网关

  • 网关(Gateway)就是一个网络连接到另一个网络的“关口”。
    按照不同的分类标准,网关也有很多种。TCP/IP协议里的网关是最常用的,在这里我们所讲的“网关”均指TCP/IP协议下的网关。

大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。
所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信

5. liunx 的抓包?

tcpdump -i ens33 port 25 -w msg.pcap

6. 网络编程

7. 慢查询的作用

慢查询的开启 是为了分析sql语句 如:查询过慢的语句 分析sql语句 以及优化mysql的索引等等

分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。

8. nginx

nginx 负载均衡:

upstream myapp1 {
        ip_hash;
            server localhost:18080;
            server localhost:18081;
            server localhost:18082;
}
server {
            listen 8000;
            location / {
                proxy_pass http://myapp1;
        }
}

python后端面试_第1张图片

  (1)【客户端层】到【反向代理层】的负载均衡,是通过“DNS轮询”实现的;
  (2)【反向代理层】到【站点层】的负载均衡,是通过“nginx”实现的;
  (3)【站点层】到【服务层】的负载均衡,是通过“服务连接池”实现的;
  (4)【数据层】的负载均衡,要考虑“数据的均衡”与“请求的均衡”两个点,常见的方式有“按照范围水平切分”与“hash水平切分”。

nginx是如何实现高并发的
一个主进程,多个工作进程,每个工作进程可以处理多个请求
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即@skoo所说的webserver刚好属于网络io密集型应用,不算是计算密集型。

9. 分布式系统

分布式系统:多个能独立运行的计算机(称为结点)组成。各个结点利用计算机网络进行信息传递,从而实现共同的“目标或者任务”。

在分布式系统中:

1、应用可以按业务类型拆分成多个应用,再按结构分成接口层、服务层;我们也可以按访问入口分,如移动端、PC端等定义不同的接口应用;

2、数据库可以按业务类型拆分成多个实例,还可以对单表进行分库分表;

3、增加分布式缓存、搜索、文件、消息队列、非关系型数据库等中间件;

很明显,分布式系统可以解决集中式不便扩展的弊端,我们可以很方便的在任何一个环节扩展应用,就算一个应用出现问题也不会影响到别的应用。

随着微服务Spring Cloud & Docker的大热,及国内开源分布式Dubbo框架的重生,分布式技术发展非常迅速。

分布式系统虽好,也带来了系统的复杂性,如分布式事务、分布式锁、分布式session、数据一致性等都是现在分布式系统中需要解决的难题,虽然已经有很多成熟的方案,但都不完美。分布式系统也增加了开发测试运维成本,工作量增加,分布式系统管理不好反而会变成一种负担。

10. mysql 优化 左查询 右查询的意义

mysql优化

1. Mysql中主要的两种存储引擎: MyISAM 和 InnoDB
2. 分库分表
3. 索引
4. (1)普通索引(Index):最基本的索引,它没有任何限制。
4. (2)唯一索引(UniqueIndex):它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
4. (3)主键索引(PrimaryIndex):它是一种特殊的唯一索引,不允许有空值(唯一索引允许)。主键索引可以作为外键,唯一索引不可以,并且每个表只能由一个主键索引。
4. (4)全文索引(FullTextIndex):在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录,全文索引只可创建在BLOB、TEXT、VARCHAR、CHAR等特殊类型上。
4. (5)组合索引(联合索引、复合索引):多个列组合成一个索引,组织索引遵循最左前缀原则,即组合索引中最先出现的列要出现在查询语句中,索引才会生效。
组合索引是先对第一列进行排序,第一列相同时再对第二列排序……
组合索引的不严谨检索过程就是先根据第一个索引找到对应的数据,再根据第二个索引找,一直这样下去
4. 缓存

左查询 以左侧为基准点

这里写图片描述

右查询 以右侧为基准点
这里写图片描述

11. mvc mvvm

mvc
mvc

12. docker

这里写图片描述

名词 描述
Docker 镜像 Docker镜像是用于创建Docker容器的模板
Docker 容器 容器是独立运行的一个或一组应用 。
Docker 客户端 Docker客户端通过命令行或者其他工具使用Docker API 与 Docker的守护进程进行通信
Docker主机 一个物理或者虚拟的机器用于执行Docker守护进程和容器
Docker仓库 Docker仓库用来保存镜像 , 可以理解为代码控制中的代码仓库
Docker Machine Docker Machine 是一个简化的Docker安装的命令行工具 , 通过一个简单的命令行即可在相应的平台上安装Docker

13. 二叉树

python版二叉树

14. https http的区别 xss攻击

15. 异步同步

异步的使用场景:

1、不涉及共享资源,或对共享资源只读,即非互斥操作

2、没有时序上的严格关系

3、不需要原子操作,或可以通过其他方式控制原子性

4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能

5、不影响主线程逻辑

同步:一直等任务完成后才会进行下一步的操作,故不适用于需要用户一直等待的操作,如邮件发送等

同步的好处:

1、同步流程对结果处理通常更为简单,可以就近处理。

2、同步流程对结果的处理始终和前文保持在一个上下文内。

3、同步流程可以很容易捕获、处理异常。

4、同步流程是最天然的控制过程顺序执行的方式。

16. 乐观锁悲观锁 死锁,以及死锁的条件

17. 数据库面试题

18.微服务

这里写图片描述

19.多进程多线程 协程

进程 中可以有多个线程 线程中可以又多个协程
进程:对系统而言,一个任务就是一个进程,多进程会产生多个任务,有各自不同的进程号。
线程为内核态的
协程是用户态的 故切换时消耗代价少

进程线程协成python

部分参考转载他人的csdn

…未完待续。。。。。。

你可能感兴趣的:(python后端面试)