面试题答案
一键面试服务器配置优化
- 硬件升级:增加服务器的CPU核心数、内存容量以及使用更快的存储设备(如SSD)。
- 负载均衡:
- Nginx:安装Nginx,配置反向代理和负载均衡功能。例如,在Nginx配置文件(如
/etc/nginx/sites-available/default
)中添加如下配置:
- Nginx:安装Nginx,配置反向代理和负载均衡功能。例如,在Nginx配置文件(如
http {
upstream flask_backend {
server 127.0.0.1:5000; # Flask应用运行地址
server 127.0.0.1:5001; # 可添加多个实例
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://flask_backend;
proxy_set_header Host $host;
proxy_set_header X - Real - IP $remote_addr;
proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
proxy_set_header X - Forwarded - Proto $scheme;
}
}
}
- **HAProxy**:同样可实现负载均衡,安装后在其配置文件(如`/etc/haproxy/haproxy.cfg`)中配置:
frontend http - in
bind *:80
default_backend flask - servers
backend flask - servers
balance roundrobin
server app1 127.0.0.1:5000 check
server app2 127.0.0.1:5001 check
- 使用Gunicorn:它是一个高性能的Python WSGI HTTP服务器。安装后,可使用如下命令启动Flask应用:
gunicorn -w 4 -b 0.0.0.0:5000 your_flask_app:app
,其中-w
指定工作进程数,一般设置为CPU核心数的2倍 + 1 。
数据库优化
- 查询优化:
- 分析慢查询日志(如MySQL的慢查询日志),找出执行时间长的查询语句。例如在MySQL中,开启慢查询日志:在
my.cnf
文件中添加slow_query_log = 1
和long_query_time = 2
(设置2秒以上的查询为慢查询)。 - 对频繁查询的字段添加索引。在SQLAlchemy(Flask常用数据库ORM)中,例如定义模型时添加索引:
- 分析慢查询日志(如MySQL的慢查询日志),找出执行时间长的查询语句。例如在MySQL中,开启慢查询日志:在
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), index=True) # 为username字段添加索引
email = db.Column(db.String(120), unique=True, index=True)
- 数据库连接池:使用
SQLAlchemy
连接数据库时,配置连接池。例如:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.pool import QueuePool
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///your_database.db'
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'poolclass': QueuePool,
'pool_size': 5,
'max_overflow': 10
}
db = SQLAlchemy(app)
- 读写分离:对于读多写少的场景,配置主从数据库架构。以MySQL为例,在主库配置文件(
my.cnf
)中设置log - bin = /var/log/mysql/mysql - bin.log
开启二进制日志,在从库配置文件中设置server - id = 2
等相关参数,然后通过CHANGE MASTER TO
语句配置从库连接主库。在Flask应用中,使用Flask - SQLAlchemy - Replica
等扩展来实现读写分离。
缓存策略
- 页面缓存:使用Flask - Caching扩展实现页面缓存。安装后,配置如下:
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE':'simple'})
@app.route('/')
@cache.cached(timeout = 60) # 缓存60秒
def index():
return "This is a cached page"
- 数据缓存:对于数据库查询结果进行缓存。例如,查询数据库获取用户信息时:
from flask import Flask
from flask_caching import Cache
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE':'simple'})
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80))
@app.route('/user/<int:user_id>')
@cache.cached(timeout = 3600, query_string = True) # 缓存1小时,根据查询字符串区分缓存
def get_user(user_id):
user = cache.get(f'user_{user_id}')
if not user:
user = User.query.get(user_id)
cache.set(f'user_{user_id}', user, timeout = 3600)
return f"User: {user.username}"
- 使用Redis缓存:更改缓存类型为Redis。安装
redis
和flask - caching
后,配置:
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
cache = Cache(app, config={
'CACHE_TYPE':'redis',
'CACHE_REDIS_HOST': 'localhost',
'CACHE_REDIS_PORT': 6379,
'CACHE_REDIS_DB': 0
})
异步处理
- Celery:安装Celery及其相关依赖(如
redis
作为消息代理)。定义任务:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def long_running_task():
# 模拟长时间运行的任务
import time
time.sleep(10)
return "Task completed"
在Flask应用中调用任务:
from flask import Flask
from tasks import long_running_task
app = Flask(__name__)
@app.route('/start_task')
def start_task():
result = long_running_task.delay()
return f"Task started with ID: {result.id}"
- Flask - SocketIO:用于实现实时通信和异步更新。安装后,在Flask应用中集成:
from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
@socketio.on('connect')
def handle_connect():
print('Client connected')
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
在前端页面使用JavaScript通过Socket.IO与后端进行实时交互,实现异步数据传输。
代码优化
- 减少不必要的计算:检查代码中是否有重复计算的部分,将其提取并缓存结果。例如,在函数中多次计算相同的值,可将计算结果保存到变量中。
- 优化算法复杂度:分析代码中使用的算法,尽量使用时间复杂度和空间复杂度更低的算法。如使用更高效的排序算法、查找算法等。
- 懒加载:对于一些不急需的数据,采用懒加载方式。例如在Flask视图函数中,延迟加载数据库关系数据,通过
joinedload
或subqueryload
等方式在需要时加载,而不是一开始就加载所有关联数据。
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import joinedload
db = SQLAlchemy()
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
children = db.relationship('Child', backref='parent')
class Child(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))
@app.route('/parent/<int:parent_id>')
def get_parent(parent_id):
parent = Parent.query.options(joinedload(Parent.children)).get(parent_id)
return f"Parent with {len(parent.children)} children"