从互联网诞生以来,基本上所有的程序都属于网络程序,也就需要设计到网络编程,在python中,就是在python程序本身这进程内,链接别的服务器进程的通信端口进行通信。在Python程序员找工作的时候,京城被问到关于网络编程的问题。下面就和大家分享一下那些面试中经常出现的问题吧。
1.Tcp 协议和 udp 协议有什么区别?
(1)TCP 面向连接(如打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接。
(2)每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信。
(3)TCP 首部开销 20 字节;UDP 的首部开销小,只有 8 个字节。
(4)TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。
2.Post 和 get 区别?
(1)GET 请求的数据会暴露在地址栏中,而 POST 请求则存在表单中提交所以 post 相对安全。
(2)post 传输数据比 get 大。
(3)post 比 get 安全。
3.cookie 和 session 的区别?
(1)cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
(2)cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE欺骗考虑到安全应当使用 session。
(3)session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE。
(4)单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
(5)建议:将登陆信息等重要信息存放为 SESSION其他信息如果需要保留,可以放在 COOKIE 中。
4.什么是僵尸进程和孤儿进程,怎么避免僵尸进程?
(1)孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被会被其它进程收养,不会造成影响。
(2)僵尸进程:子进程退出,而父进程迟迟不回收,造成资源浪费。
(3)避免僵尸进程的方法:1.fork 两次用孙子进程去完成子进程的任务。2.用 wait()函数使父进程阻塞。
5.
scrapy 和
scrapy-redis 有什么区别?
答:
scrapy 是一个
Python 爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而
scrapy-redis 一套基于
redis
数据库、运行在
scrapy 框架之上的组件,可以让
scrapy 支持分布式策略,
Slaver 端共享
Master 端
redis 数据库里的
item 队列、请求队列和请求指纹集合。
6.描述下
scrapy 框架运行的机制?
答:从
start_urls 里获取第一批
url 并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:
1. 如果提取出需要的数据,则交给管道文件处理;
2. 如果提取出
url,则继续执行之前的步骤(发送
url请求,并由引擎将请求交给调度器入队列
...),直到请求队列里没有请求,程序结束。
7.
Post 和
get 区别和应用场合?
区别:
Get:从指定的服务器中获取数据。
GET 请求能够被缓存;
GET 请求会保存在浏览器的浏览记录中;以
GET 请求的
URL能够保存为浏览器书签;
GET 请求有长度限制;
GET 请求主要用以获取数据。
Post:
POST 请求不能被缓存下来;
POST 请求不会保存在浏览器浏览记录中;
POST 请求的
URL 无法保存为浏览器书签;
POST 请求没有长度限制;
POST 请求会把请求的数据放置在
HTTP 请求包的包体中
,POST 的安全性比
GET的高。可能修改变服务器上的资源的请求
。
应用场合:
post:请求的结果有持续性的副作用(数据库内添加新的数据行)若使用
GET 方法,则表单上收集的数据可能让
URL 过长。要传送的数据不是采用
7 位的
ASCII 编码。
get:请求是为了查找资源,
HTML表单数据仅用来帮助搜索。请求结果无持续性的副作用。收集的数据及
HTML 表单内的输入字段名称的总长不超过
1024 个字符。
8.说一下
mysql
数据库存储的原理?
储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有
SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中
面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点:
a、存储过程能实现较快的执行速度。
b、存储过程允许标准组件是编程。
c、存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
d、存储过程可被作为一种安全机制来充分利用。
e、存储过程能够减少网络流量。
9.数据库索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用
B_TREE。
B_TREE 索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
10.
数据库优化方案
优化索引、
SQL 语句、分析慢查询
设计表的时候严格根据数据库的设计范式来设计数据库
使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘
IO
优化硬件;采用
SSD,使用磁盘队列技术
(RAID0,RAID1,RDID5)等;
采用
MySQL内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率
垂直分表;把一些不经常读的数据放在一张表里,节约磁盘
I/O
主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来
分库分表分机器(数据量特别大),主要的的原理就是数据路由
选择合适的表引擎,参数上的优化
进行架构级别的缓存,静态化和分布式
不采用全文索引
采用更快的存储方式,例如
NoSql 存储经常访问的数据。
11.数据库怎么优化查询效率?
1、储存引擎选择:如果数据表需要事务处理,应该考虑使用
InnoDB,因为它完全符合
ACID 特性。如果不需要事务处理,使用默认存储引擎
MyISAM 是比较明智的
2、分表分库,主从。
3、对查询进行优化,要尽量避免全表扫描,首先应考虑在
where 及
order by 涉及的列上建立索引
4、应尽量避免在
where 子句中对字段进行
null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
5、应尽量避免在
where 子句中使用
!= 或
<> 操作符,否则将引擎放弃使用索引而进行全表扫描
6、应尽量避免在
where 子句中使用
or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
7、
Update 语句,如果只更改
1、
2 个字段,不要
Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
8、对于多张
大数据量(这里几百条就算大了)的表
JOIN,要先分页再
JOIN,否则逻辑读会很高,性能很差。
以上就是
Python工程师数据库常见面试题。你面试的时候有遇到过吗?又或许你现在刚刚开始学习
Python开发,一定要着重掌握关于数据库相关的知识,未来是大数据时代,对于数据库的要求会越来越多。所以能掌握数据库的知识也是为自己未来的职场发展提供更多的机会。