python面试题(三)

一.项目技术点梳理

(一)Django项目

本项目是用python的Django框架开发的先后端不分离项目。项目采用MVT架构,使用的MySQL和redis数据库,用Django自带的orm与数据库交互。python

一、用户模块mysql

a.使用Django自带的用户认证系统,来完成用户登陆,密码使用pbkdf2_sha256加密存入mysql数据库。nginx

b.使用itsinstance模块对user_id进行加密生成token,将生成的token放在url经过邮件发送给用户来实现激活逻辑。面试

c.使用celery+redis实现异步发送邮件,redis用来存储任务队列(broker);redis能够替换为rabbitMQ;也能够改成短信验证,也可使用celery异步实现。redis

二、商品模块sql

a.使用FastDFS+nginx来实现静态文件的管理。FastDFS负责写入,nginx负责读取。FastDFS实现了去除冗余,负载均衡的功能。数据库

b.异步实现主页页面静态化。监听admin后台管理,当数据库数据发生变化时,使用celery异步生成主页的静态文件。实现未登陆用户访问的是静态页面,登陆用户访问的是动态页面,达到优化网站的目的。json

c.避免不停的链接mysql,使用redis作了一层缓存。flask

d.使用whoosh做为全文搜索引擎,haystack做为全文检索的框架,jieba做为中文分词包来实现的全局搜索功能。后端

三、购物车模块

a.购物车模块使用先后端分离技术实现,使用json传输数据。

b.未登陆用户的数据存放cookie中,已经登陆用户的数据存放在session,用户登陆后合并cookie和session,注意合并前判断库存

四、订单模块

a.Django事务的使用,在增删改数据库是出错了要对数据库进行回滚。

b.悲观锁和乐观锁的使用。悲观锁:当要操做某条记录时,当即将该条记录锁起来,谁也没法操做,直到它操做完。乐观锁:在查询数据的时候不加锁,在更新时进行判断,判断更新时的库存和以前,查出的库存是否一致。

c.使用支付宝api实现的付款。(芝麻信用的实名认证api也能够提,在用户实名认证那个模块中)

五、项目部署

使用uWSGI+nginx实现动静分离负载均衡。

 

(二)Flask项目(flask项目更侧重于业务)

    本项目是使用flask框架开发的,先后端分离项目。项目主要使用flask框架,flask_sqlalchemy做为orm,mysql和redis数据库等技术。

一、登陆注册

后端生成图片验证码加容联云(阿里云)短信认证明现用户注册。用户登陆后将用户信息存到session中来保持用户的登陆状态,登陆登出都是经过session来实现的。

二、我的中心

a.使用七牛云(阿里云)文件对象存储系统来存储用户上传的静态文件。

b.使用芝麻信用实名认证接口来实现的用户实名认证。

三、商品展现模块

业务逻辑处理,根据项目具体状况来讲。这里能够重点说说业务知足了哪些需求。

四、订单模块

a.业务上:生成订单、接单、拒单、评论的实现

b.redis事务的使用

import redis
import sys
if __name__=="__main__":
    try:
        conn=redis.StrictRedis('192.168.80.41')
        pipe=conn.pipeline()
        pipe.sadd('s001','a')
        sys.exit()
        #在事务尚未提交前退出,因此事务不会被执行。
        pipe.sadd('s001','b')
        pipe.execute()
    except Exception as err:
        print(err)

二.面试中高频考点

(三)进程、线程、协程

(四)Mysql与MongoDB类比记忆

(五)mysql链接池

数据库链接池(Connection pooling)是程序启动时创建足够的数据库链接,并将这些链接组成一个链接池,由程序动态地对池中的链接进行申请,使用,释放。

建立数据库链接是一个很耗时的操做,也容易对数据库形成安全隐患。因此,在程序初始化的时候,集中建立多个数据库链接,并把他们集中管理,供程序使用,能够保证较快的数据库读写速度,还更加安全可靠。

假设网站一天有很大的访问量,数据库服务器就须要为每次链接建立一次数据库链接,极大的浪费数据库的资源,而且极易形成数据库服务器内存溢出、拓机。

数据库链接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤其突出.对数据库链接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库链接池正式针对这个问题提出来的.数据库链接池负责分配,管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是从新创建一个。

(六)数据库优化

1.优化索引、SQL 语句、分析慢查询;

2.设计表的时候严格根据数据库的设计范式来设计数据库;

3.使用缓存,把常常访问到的数据并且不须要常常变化的数据放在缓存中,能节约磁盘IO

4.优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等

5.采用MySQL 内部自带的表分区技术,把数据分层不一样的文件,可以提升磁盘的读取效率;

6.垂直分表;把一些不常常读的数据放在一张表里,节约磁盘I/O;

7.主从分离读写;采用主从复制把数据库的读操做和写入操做分离开来;

8.分库分表分机器(数据量特别大),主要的的原理就是数据路由;

9.选择合适的表引擎,参数上的优化

10.进行架构级别的缓存,静态化和分布式;

11.不采用全文索引;

12.采用更快的存储方式,例如 NoSQL存储常常访问的数据。

(七)Mysql查询优化

一、储存引擎选择:若是数据表须要事务处理,应该考虑使用InnoDB,由于它彻底符合ACID特性。若是不须要事务处理,使用默认存储引擎MyISAM是比较明智的

二、分表分库,主从。

三、对查询进行优化,要尽可能避免全表扫描,首先应考虑在 where 及 order by 涉及的列上创建索引

四、应尽可能避免在 where 子句中对字段进行 null 值判断,不然将致使引擎放弃使用索引而进行全表扫描

五、应尽可能避免在 where 子句中使用 != 或 <> 操做符,不然将引擎放弃使用索引而进行全表扫描

六、应尽可能避免在 where 子句中使用 or 来链接条件,若是一个字段有索引,一个字段没有索引,将致使引擎放弃使用索引而进行全表扫描

七、Update 语句,若是只更改一、2个字段,不要Update所有字段,不然频繁调用会引发明显的性能消耗,同时带来大量日志

八、对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,不然逻辑读会很高,性能不好

(八)http/https

HTTP:是互联网上应用最为普遍的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可使浏览器更加高效,使网络传输减小。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,所以加密的详细内容就须要SSL。

HTTPS协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。

(九)restful风格

1. 将api部署在专用域名下

2. 将API的版本号放在url中

3. 路径表示API的具体网址。每一个网址表明一种资源。 资源做为网址,网址中不能有动词只能有名词,通常名词要与数据库的表名对应。并且名词要使用复数。

4. 对于资源的具体操做类型,由HTTP动词表示。 经常使用的HTTP动词有四个。(get、post、put、delete)

5. 若是资源数据较多,服务器不能将全部数据一次所有返回给客户端。API应该提供参数,过滤返回结果。 

6. 服务器向用户返回经常使用http标准状态码。

7. 服务器返回的错误信息,以键值对的形式返回。

8. 响应结果

返回商品列表GET    http://www.example.com/goods

返回单个商品GET    http://www.example.com/goods/cup

返回新生成的商品POST   http://www.example.com/goods

返回一个空文档 DELETE http://www.example.com/goods

9. 在返回响应结果时提供连接其余API的方法,使客户端很方便的获取相关联的信息。

10.服务器返回的数据格式,应该尽可能使用JSON,避免使用XML。

相关文章
相关标签/搜索