面试

Linux常用命令

ls     列出目录中文件和子目录
cd     切换到当前目录
mkdir  创建新目录
cp     复制文件或目录
rm     删除文件或目录
mv     移动或者重命名文件或目录
pwd    显示当前目录的路径
cat    连接文件并显示内容
ssh    安全地远程登录到另一台计算机
ping   测试与另一台计算机之间的网络连接
top    显示系统资源的资源的实时使用情况
ps     显示当前进程的快照

nginx

是一个高性能的HTTP反向代理服务器 主要作用于web服务器,进行反向代理和负载均衡,能够同时处理大量连接并具有较低的内存消耗

nginx的原理

原理是基于事件驱动和异步非阻塞的方式,采用单线程的方式来处理客户端请求,通过非阻塞调度和事件通知机制实现高并发请求处理,这使得nginx具有较高的性能和稳定性

正反向代理

正向代理:
1.客户端向代理服务器发送请求,代理服务器将请求转发给目标服务器,并将目标服务器响应返回给客户端
2.客户端无法直接访问目标服务器,而是需要通过代理服务器进行访问
3.代理服务器可以缓存请求结果,提升用户体验,还能过滤请求并对其进行管理

反向代理:
1.当客户端向服务器发送请求时,反向代理服务器收到请求并将其转发到真实的服务器上
2.客户端不知道真实服务器的存在,只与反向代理服务器进行通信
3.反向代理服务器可以根据负载均衡算法将请求分配到多个真实的服务器上,以提高请求处理速度

总结:
正向代理隐藏了客户端,反向代理隐藏了服务端。正向代理服务器扮演的是客户端的校色,帮助客户端发送请求,而反向代理服务器则扮演的是服务端的角色,为客户端提供服务,同时将请求转发到后端的服务器上

负载均衡

一种常见的技术方案,用于将大量请求分摊到多台服务器上,从而提高系统性能和可用性。在互联网应用中,负载均衡通常被用于分发web、数据库等服务的流量

负载均衡有两种实现方式
      硬件负载均衡,软件负载均衡
    
硬件负载均衡:
   硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,例如F5和A10等商业设备,这些设备性能强,功能齐全,价格昂贵,大型企业使用
    
软件负载均衡:
   软件负载均衡是通过在服务器上安装负载均衡软件实现的,常用开源软件有LVS、HAProxy、Nginx等。软件负载均衡具有成本低、灵活性高的优点、适合中小型企业使用
    
根据工作层次不同,负载均衡可以分为四层负载均衡和七层负载负载均衡。四层负载均衡工作在传输层,可以基于来源地IP地址、端口号等信息进行负载均衡;而七层负载均衡工作在应用层,可以基于协议,URL路径等信息进行负载均衡

docker

docker是一个开源项目实现虚拟化技术

cs架构 使用的是http协议 符合resful规范

docker镜像:镜像是基于一堆文件,相当于虚拟机装了操作系统,又装了软件了一堆文件

docker容器:镜像运行起来成了容器 可以当成一台虚拟机上面装了一些软件

docker官网拉取镜像

什么是laas,Pass和Saas

laas:基础设施即服务
    laas公司会提供场外服务器,存储和网络硬盘,你可以租用
    
Paas:平台服务
    paas公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。节省了硬件成本
    
saas:软件即服务
     软件开发,部署,运维--->公司来做卖给其他公司

docker启动设置镜像

启动
systemctl start docker

停止
systemctl stop docker

查看docker状态
systemctl status docker

镜像相关命令

拉取镜像
docker pull 指定的标签

查看本地镜像
docker images

删除镜像
docker rmi  镜像ID

容器相关命令

查看正在运行的容器
docker ps

查看所有容器
docker ps -a

运行容器

两步:创建容器create 运行容器run

run后面有很多参数
-i  表示运行的容器
--name  为创建容器命名 不写随机生成
-v 表示目录映射
-id 不会进入到容器内部
-it 是进入到容器内部

删除容器

docker rm 容器id

应用部署

比如部署一个mysql
创建文件夹
插入配置信息
做目录映射
创建库创建表插入数据
关闭容器删除容器,mysql容器没了,但是数据在宿主机上
再运行起来一个容器做好目录映射数据就回来了

Dockerfile

是一个由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建出来一个新的镜像

dockerfile的命令
FROM 基础镜像    # 基于哪个基础镜像来构建
ENV key value  # 设置环境变量
RUN            # 在容器中执行命令
ADD     # 将宿主机文件复制到容器内,如果是一个压缩文件会自动解压
COPY    # 和ADD差不多但不会自动解压
WORKDIR  # 设置工作目录

dockerfile构建项目流程

有一个项目开发完了
在项目根路径新建Dockerfile,写入命令
把代码提交到git上

上线人员在上线机器把代码拉下来
构建镜像
运行容器
就上线了

docker私有仓库

远端创建仓库
给镜像打标签
登录到远端
提交

dockercompose介绍

单机编排
使用YAML文件来配置我们应用程序的服务
使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务

多机编排:k8s

dockercompose常用命令

启动管理容器
docker-compose up  # 会自动搜索当前路径下的 docker-compose.yml文件

docker-compose stop  # 停止,不会删除容器和镜像

docker-compose down  # 也是停止并删除关联的容器

docker-compose start  # 启动yml文件管理的容器

docker-compose ps  # 正在运行的容器

python2 python3区别

python2用的是ascii码  python3是utf8
python3 print()函数代替了print语句

range和xrange
python2中range直接产生一个列表 里面含有多个值
python3中range类似于工厂,你要我就生产,不会占太多的内存空间

内置函数

map 映射
zip 拉链
filter 过滤
reduce  归总
sorted  排序
bytes   类型转换

匿名函数

关键字 lambda
结构:
lambda形参:返回值

函数递归

直接或者间接调用自己

最大递归深度为1000

迭代器

迭代:
  不依赖索引取值的方式,不需要关注它的位置,只要能够一个个取值,就称之为迭代
    for循环  next()
    
可迭代对象:
在python中可以被for循环和next取值的对象称之为可迭代对象,内置有__iter__方法的都能成为可迭代对象
   字典,列表,字符串,元组,集合,文件对象
    
迭代器:
  迭代器要满足两个条件__iter__和__next__
  调用可迭代对象,通过iter方法返回一个迭代对象,然后不断的用next方法取值,直到迭代完才停止迭代

装饰器

在不改变被装饰对象的原代码和调用方式的情况下给被装饰度睇相添加新的功能

反射机制

反射机制是一种编程语言特性,它允许程序在运行时获取、检查和修改对象的属性和方法
也就是利用字符串操作对象的属性和方法

# python
hasattr()
判断字符串在对象中是否存在属性和方法,存在返回true,不存在返回flase

getattr()
根据字符串在对象中查找对应的属性和方法 找到了返回方法的引用 找不到则抛异常

setattr()
根据字符串给对象设置属性和方法

delattr()
根据字符串删除对象的属性和方法

文件操作

open

with open(文件路径,读写模式)
以文本模式打开需要指定编码

读写模式
r 只读
w 只写
a 只追加,文件末尾追加

魔法方法

__new__
创建一个对象会调用__new__方法
__init__
对象实例化会调用__init__ 并且有返回值 返回实例化好的对象

__call__
对象加括号调用

__str__
对象执行打印操作触发

__getattr__
对象点属性 属性不存在触发

__setattr__
对象点属性等于一个值会触发

__enter__
当对象被当作with上下文管理器操作开始自动触发
__exit__
当对象参与的with上下文管理器语法执行完之后会触发

进程

资源分配的最小执行单位,一个程序运行至少开一个进程

使用multiprocessing模块
Process类

函数创建进程
process加括号产生对象
对象点start()

写一个类继承process
重写run方法
用自己的类实例化一个对象
然后start()

线程

cpu调度的最小单位

使用threading模块
Thread类

协程

单线程下实现并发,代码层面遇到io,自己切换

async 和 await 关键字,不借助于第三方,开启协程asyncio 包
   -必须写在一个函数前, async def task()--->这个函数执行的结果是协程函数
   -await 只要是io操作的代码,前面必须加 await

在哪用过

计算密集型用多进程 io密集型开一般开多线程
爬取别人数据喜欢开多线程,因为爬虫的io比较多

实际项目中,不需要我们开启进程线程,可以借助于第三方框架比如celery就可以做异步操作
celery的worker,就是进程线程架构
django框架是支持并发的,没有开启多进程和多线程,只要是符合uwsgi的,web服务器在进入django框架之前,开启了进程和线程来执行视图函数

元类

元类可以定制类的创建和行为,type是默认的元类,在python3中所有新式类的基类,我们可以自定义元类,用它来代替type控制类创建过程中的行为,自定义属性和方法

什么是猴子补丁,有什么作用

在程序运行过程中,动态替换的一种技术

gevent--->猴子补丁--->monkey.patch_all()--->动态替换内部会阻塞的代码

例子:
  time
  socket
  同步代码:io操作,会阻塞,会释放gil锁,这条线程就会被释放掉cpu的执行
  异步代码:io操作,不释放gil锁
  把所有内置的会释放gil锁的模块,动态替换成gevent自己写的,不会释放gil锁的模块
   动态的把所有同步的代码替换成异步代码,所有会阻塞的代码都替换

gil锁

首先gil锁不是python的特性,它是在实现Cpython解释器时引入的一个概念

全局解释器锁
本质也是一把大的互斥锁
作用是:一个进程内只能由一条线程执行
原因是:垃圾回收机制不是线程安全的

gil锁只能确保进程内多线程数据不会被垃圾回收机制弄乱
并不能确保程序里面的数据是否安全

# 为什么有了gil锁还要互斥锁
gil锁:
  全局解释器锁,线程要执行,必须先获取gil锁才能执行
互斥锁:
  为了保证多线程并发操作数据而设置的锁,保证在加锁和释放锁之间,其他线程不能操作

垃圾回收机制

引用计数,标记清除,分代回收

引用计数
  为每一个对象维护一个引用计数器,当一个对象引用被创建或者复制时,计数器+1,但一个对象的引用被销毁时,计数器-1,当计数器为0时,意味着对象已经再也没有被使用了,可以将其内存释放掉
    
标记清除
  标记清除的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象,当内存占用到了临界值时,程序会自动停止然后扫描程序数据,并给只产生循环引用的数据打上标记,之后一次性清除
    
分代回收
  存在的时间越久的对象,就越不可能是垃圾,就应该减少对它的垃圾回收频率

ORM语法

ORM:对象关系映射
     使用python面向对象的语法来操作数据库
     就是对象可以点出来一些方法

增        
create

查
filter

改
update

删
delete

DTL语法(模板语法)

模板语法

变量
  {{}}表示,可以显示存储在上下文中的变量
过滤器
  可以对变量的值进行修改
标签
  {% %} 控制模板处理的逻辑

中间件

处于操作系统和应用程序之间的软件,中间件位于操作系统软件与用户的应用软件的中间所以叫中间件,中间件都要遵从TCP/IP协议

如何自定义中间件?

1 创建存储自定义中间件代码的py文件
2 参考自带中间件的代码编写类并继承
3 在类中编写五个可以自定义的方法
  process_request
  process_response
  process_view
  process_exception
  process_temlate_response

解决csrf跨站请求

CSRF(跨站请求伪造)是一种常见的Web攻击方式。要解决CSRF攻击

使用CSRF token:在表单中引入一个随机生成的token,每次提交表单时将该token也一同提交到服务器端,服务器端验证该token是否合法,从而判断该请求是否为合法请求

插拔式设计

将各个功能制作成配置文件的字符串形式
如果想拥有该功能就编写对应的字符串
不想用该功能就注释掉对应的字符串

利用字符串导入模块
importlib模块

auth认证模块

django自带一个admin路由,需要自己填写管理员账号密码,使用admin后台管理需要先创建表 创建管理员账号

反向解析

通过一个名字可以反向解析出一个结果 该结果可以访问到对应的某个路由

实现:
  起别名
    
html页面上模板语法     {% url 'login_view' %}

后端语法              reverse('login_view')

路由分发

总路由只负责分发 不负责视图函数对应
使用路由分发之前 总路由自己干与视图函数的匹配
使用路由分发之后 总路由只按照应用名分配匹配方向

rbac权限控制

是一种常用的权限控制模型,该模型以角色为基础,通过将权限分配给角色,再将角色授权给用户,从而实现对用户的权限控制

通常需要先设定好权限的细粒度控制策略,然后创建角色,并分配不同的权限到不同的角色中,最后再将角色分配给特定的用户

优点:
  它能够很好地管理组织内部的员工权限,同时还支持灵活的权限调整功能,能够随时根据业务需要进行角色和权限的动态调整。此外,RBAC模型还能够减少不必要的权限泄露,降低了安全风险

F/Q查询

F查询
当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询

Q查询
可以用逻辑运算符
逗号是 and
| 是 or
~ 是 not

only与defer

ORM通常支持懒加载来延迟获取关联对象的方法调用时间,从而避免了在不必要的情况下加载大量数据

only与defer是ORM查询优化是两个方法

only
只选择指定的字段进行查询,排除其他字段。这种查询方式可以避免查询不必要的字段,从而加快查询速度

defer
排除指定的字段,查询其他字段。这种查询方式可以延迟加载不必要的字段,因此可以降低查询的开销

froms组件

forms组件是用于处理Web表单的一种技术

数据校验
标签渲染
展示信息

flask请求扩展

before_request:请求来了会走,如果他返回了四件套,就结束了
after_request :请求走了会走,一定要返回response对象
before_first_request:第一次来了会走
teardown_request:无论是否出异常,会走
errorhandler:监听状态码,404  500
template_global:标签
template_filter:过滤器

flask蓝图

划分目录

blueprint
导入蓝图类
实例化得到蓝图对象
app中注册蓝图
然后在不同的视图文件使用蓝图注册路由

flask模板语法

Flask使用Jinja2模板引擎来渲染HTML页面

变量:使用双花括号来表示变量
控制结构:{% if %}
for循环

wtforms

flask 中使用第三方的wtforms 实现像django的forms一样的功能
- 第一步:导入,定义一个类,继承forms
-第二步:模板中, for循环生成模板
-第三步:视图函数中,使用form校验数据

SQLAlchemy

 使用flask-sqlalchemy集成
    1 导入 from flask_sqlalchemy import SQLAlchemy
    
    2 实例化得到对象
    	db = SQLAlchemy()
        
    3  将db注册到app中
    	db.init_app(app)
        
    4 视图函数中使用session
    	全局的db.session  # 线程安全的
        
    5 models.py 中继承Model
    	db.Model
        
    6 写字段 
    	username = db.Column(db.String(80), unique=True, nullable=False)
        
    7 配置文件中加入
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root@127.0.0.1:3306/ddd?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1
    # 追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = False

事务特性

什么是事务

在MySQL中事务是一种机制,一个操作序列,是访问和更新数据库的执行单元,事务里会包含一个或多个数据库的操作命令,当所有命令作为一个整体一起向系统提交或者撤销操作请求的时候,那么这一组数据库的命令要都执行,要么都不执行,这就牵扯到了事务的四大特性,这就是原子性

事务的特性

1. 原子性
   就是事务所包含的所有操作,要么全部成功,要么全部失败
2. 一致性
   事务执行前和执行后,必须保持一致
3. 隔离性
   一个事务执行的过程中,并不能被别的事务干扰
4. 持久性
   事务被提交后,对数据的修改是永恒的,即使是出现故障也能够正常保持

事务的隔离级别

1. Serialzable(可串行化):可避免脏读、不可重复读、幻读的发生
2. Repeatable(可重复读):可以避免脏读、不可重复读的发生
3. Read committed(读已提交):可避免脏读的发生
4. Read uncommited(读未提交):最低级别,任何情况都无法保证

MySQL默认的是 Repeatable,oracle默认的是Read commited

MySQL支持四种隔离级别,而oracle支持Serialzable和Read committed这两种级别

脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并不一定最终存在的数据,这就是脏读

不可重复读

不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况

例如:
  事务 A 多次读取同一数据,但事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

幻读

幻读并不是说两次读取获取的结果集是不同的,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作

更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读

查的时候明明没有这条记录,但插入的时候 却告诉我 主键冲突,这就好像幻觉一样。

这才是所有的幻读。 不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影

MySQL常用约束

not null:指定该字段不能为空
unique:唯一值
primary key:主键
foreign key:外键
default:默认值

读写分离

读写分离:将读操作和写操作分别分配到不同的服务器上,减轻主服务器的负担,提高系统的性能和可扩展性。读写分离可以通过 MySQL Proxy 或者应用程序实现,也可以通过使用 MySQL Cluster 和多个实例来实现

主从搭建

主从搭建:主从复制是一种基于二进制日志(binlog)的数据复制方式,将主服务器上的所有更新操作记录在二进制日志中,然后通过网络传输到从服务器上执行。从服务器只能读取数据,不能写入数据,保持与主服务器数据的一致性。主从复制可以提高数据库的可用性、容错性和性能,适用于读写比例不平衡的场景

分库分表

将大型数据库中的数据按照一定的规则划分到多个数据库或者多张表中,减少单个数据库或者表的数据量,提高查询效率和可扩展性,适用于数据量大、访问频繁的场景。分库分表可以通过垂直分区和水平分区来实现
posted @ 2023-04-18 22:23  Super小赵  阅读(23)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************