面试技术点

1、跨域

使用django的cors-headers拓展来解决跨域问题,为什么会存在跨域,因为为了安全两个服务器是不支持直接通信的,所有我们使用cors-headers来解决,首先我们在django的配置文件里,注册app应用,然后在中间层的最上面添加解决跨域的中间件,然后配置白名单域名。

2、多模式登录采用djangorestframework-jwt

*在我们项目中为了提高用户体验,让用户输入手机号或者密码都能登录,然后就重写了Django认证系统,继承ModelBackend然后重写authenticate方法,

JWT

JWT是一种认证机制,抛弃传统的session。
传统session认证还是会在服务器保存资源,当用户量大了还是有影响的。
JWT它的机制是在用户登录后,根据服务器保存的秘钥生成JWT的,然后发给前端从而不会占用服务器的资源,前端每次请求需要认证的接口就带上这个JWT,然后后端根据秘钥解析是否为正确的。
JWT主要是三个部分组成:
1、header头部
头部主要是由:声明类型、声明加密的算法组成
2、playload载荷
主要保存的是一些过期时间,和用户身份的唯一标示
3、signature
最后一个部分是由前面两个加上自己服务器保存的秘钥然后加密的。
加密流程:
1、header(base64加密)
2、playload(base64加密)
3、header+playload+secret然后在上herder里的加密方式在加密一遍

3、忘记密码

每一步都根据下一步要用到的信息生成accesstoken保证接口安全
比如:我们修改密码第一步让用户输入用户名,然后我们后端验证这个用户是否存在,然后如果存在就把这个用户的id,手机号生成accesstoken返回前端。到下一步的时候前端带上这个accesstoken我们解析出来用户id,和手机号然后判断是否正确然后在进行下一步的操作。

4、页面静态化

页面静态化主要是看业务的需求,频繁被访问,为了提升访问速度。比如京东就是用到的静态化技术,静态化技术主要就是在后端直生成的数据根据模板填充好然后保存到成html文件然后放到静态文件服务器中,用户访问的页面都是已经生成好数据的页面,不过这个方式要异步去执行,然后我们项目中用的是定时任务加celery去更新静态化页面。

5、celery

celery主要是异步请求的一个框架,然后它是一个单独的进程。
celery跟客户端主要是通过一个消息队列进行交互,消息队列我们项目是用redis做的,客户端把任务名称,放到这个消息队列里,然后celery这边它是以轮询的方式到任务队列里去找,找到之后它就会开启一个新的进程执行自己这边对应名称的方法。然后如果有执行结果celery会把结果放到结果队列里,这个结果队列用redis或者mysql又可以做,然后客户端直接redis取。

6、搜索引擎Elasticsearch

1、ES搜索引擎主要是一个分布式的搜索引擎,然后它是java写的,然后它性能非常好,很多大公司都在用。
2、项目中使用drf-haystack进行对接。
3、ES提供了REST API风格的接口
4、通过搜索引擎进行数据查询时,搜索引擎并不是直接在数据库中进行查询,而是搜索引擎会对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据。我们在通过搜索引擎搜索时,搜索引擎将关键字在索引数据中进行快速对比查找,进而找到数据的真实存储位置,我们可以将索引结构数据想象成是字典书籍的索引检索页,里面包含了关键词与词条的对应关系,并记录词条的位置
5、ES不支持中文分词,需要引入ik的扩展

7、购物车

我们项目中购物车主要是业务逻辑是在用户未登录的情况下也可以添加到购物车,用户添加的商品信息我们会存在cookie中,然后登陆用户我们把商品信息保存到redis,然后在用户登录的时候我们会把这个cookie拿出来合并到redis中。

8、悲观锁、乐观锁

悲观锁: 当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,悲观锁类似于我们在多线程资源竞争时添加的互斥锁,容易出现死锁现象,采用不多
乐观锁:并不是真实存在的锁,它的机制是操作之前会保存有一个标识,然后在更新数据的时候在查看这个标识是否一致,从而知道是否数据被修改过。

9、文件存储采用七牛云(了解搭建FastDFS文件系统)

在我们项目中的文件系统采用第三方的服务,因为方便,自己搭建FastDFS文件系统还要自己去管理维护,很麻烦。

项目的缓存

在项目中我们是引入drf框架中的drf-extensions拓展,因为一些不长变动的以及经常被访问的数据我们可以添加到缓存中
1、在配置文件中添加缓存配置,可以配置缓存时间,单位为秒,和换成位置,我们项目中缓存位置是存在redis中,
2、drf-extensions扩展对于缓存提供了,缓存多个资源和缓存单一资源的拓展类
3、这个拓展会在把响应的数据缓存到redis中,下次访问这个接口的时候会想去缓存中找。

10、项目采用表关系采用逻辑外键。某些数据采用缓存加载。

项目中没有采用物理外键,因为物理外键查询起来很废性能,采用的是逻辑外键。
逻辑外键跟物理外键的区别就是,没有直接的关联关系,但是关联的一方的字段是保存的另一方的id。我们在需要关联的一方,在根据id去查询一遍。
缓存机制:在我们项目中主要把不常变的以及精彩访问的页面缓存到reids中如:热门排行以及地区列表这些缓存到redis
mysql主要配置主从来分担mysql压力。

11、MyISAM、InnoDB区别

MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM表不支持外键,InnoDB支持
MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
MyISAM支持全文类型索引,而InnoDB不支持全文索引。(mysql 5.6后innodb支持全文索引)

数据库优化手段

1、引擎方面,如果是只查询使用MyISAM,
2、查询大量数据要建立索引,索引数量不要超过4个, 禁止在平凡更改的字段简历索引
3、禁止使用物理外键
4、准从三范式
5、主从配置(读写分离),
6、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
7、Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗
8、大数据表禁止使用关联查询。

数据库存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

猜你喜欢

转载自blog.csdn.net/JiXiang_123/article/details/82468398