网站redis从开发到部署方案

0 阅读4分钟

这是方案,下一篇是详细步骤

一、项目结构准备

首先,确保项目目录结构清晰,建议添加以下文件:

campus_crowdfunding/
├── app.py                  # 应用主文件
├── config.py               # 配置文件
├── models.py               # 数据模型
├── user_views.py           # 用户视图
├── admin_views.py          # 管理员视图
├── requirements.txt        # 依赖文件
├── docker-compose.yml      # Docker编排文件
└── .env.example            # 环境变量示例

二、依赖安装

更新requirements.txt文件,添加Redis相关依赖:

Flask
Flask-SQLAlchemy
Flask-Migrate
redis
Flask-Caching
python -dotenv
cryptography

安装依赖:

pip install -r requirements.txt

三、配置文件设置

创建config.py,配置Redis连接和其他环境变量:

# config.py
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class Config:
    """基础配置类"""
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'sqlite:///site.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    # Redis配置
    REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0')
    REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD', '')
    
    # 密钥配置
    SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key')
    
    # 管理员密码
    ADMIN_PASSWORD = os.environ.get('ADMIN_PASSWORD', 'admin123')
    
    # 安全规则配置
    FIELD_ENCRYPTION_KEY = os.environ.get('FIELD_ENCRYPTION_KEY', 'campus_crowdfunding_field_encryption_key')

class DevelopmentConfig(Config):
    """开发环境配置"""
    DEBUG = True

class ProductionConfig(Config):
    """生产环境配置"""
    DEBUG = False
    # 生产环境强制要求设置密钥
    SECRET_KEY = os.environ.get('SECRET_KEY')
    ADMIN_PASSWORD = os.environ.get('ADMIN_PASSWORD')
    REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD')

四、初始化Redis客户端

修改app.py,集成Redis连接池和Flask-Caching:

# app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_caching import Cache
import redis
from config import Config
from models import db

# 创建Flask应用
app = Flask(__name__)
app.config.from_object(Config)

# 初始化数据库
db.init_app(app)
migrate = Migrate(app, db)

# 初始化Redis连接池
redis_pool = redis.ConnectionPool.from_url(
    app.config['REDIS_URL'],
    max_connections=10,  # 连接池最大连接数
    decode_responses=True  # 自动解码响应为字符串
)
redis_client = redis.Redis(connection_pool=redis_pool)
app.redis_client = redis_client

# 初始化Flask-Caching(用于缓存装饰器)
cache = Cache(app, config={
    'CACHE_TYPE': 'redis',
    'CACHE_REDIS_URL': app.config['REDIS_URL'],
    'CACHE_DEFAULT_TIMEOUT': 3600,  # 默认缓存1小时
    'CACHE_KEY_PREFIX': 'campus_crowdfunding:'  # 缓存键前缀
})
app.cache = cache

# 导入视图
from user_views import *
from admin_views import *

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)

五、代码中使用Redis

1. 缓存用户信息

user_views.py中使用缓存装饰器:

# user_views.py
from flask import Blueprint, jsonify, request
from models import User
from flask import current_app

user_bp = Blueprint('user', __name__)

@user_bp.route('/user/<int:user_id>', methods=['GET'])
@current_app.cache.cached(timeout=3600, key_prefix='user_%s')  # 缓存1小时
def get_user(user_id):
    """获取用户信息(带缓存)"""
    user = User.query.get(user_id)
    if not user:
        return jsonify({'error': 'User not found'}), 404
    
    return jsonify({
        'id': user.id,
        'username': user.username,
        'email': user.email,
        'school': user.school,
        'phone': user.phone
    })

2. 页面访问计数器

user_views.py中添加计数器功能:

@user_bp.route('/item/<int:item_id>', methods=['GET'])
def get_item(item_id):
    """获取失物/招领信息(带访问计数)"""
    # 增加访问计数
    cache_key = f'item:{item_id}:views'
    views = current_app.redis_client.incr(cache_key)
    
    # 查数据库获取信息
    # ...(数据库查询逻辑)
    
    return jsonify({
        'id': item_id,
        'views': views,
        # 其他信息...
    })

3. 会话管理(可选)

如果需要用Redis存储会话:

# app.py
from flask_session import Session

# 配置会话存储
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis_client
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_USE_SIGNER'] = True

# 初始化会话
Session(app)

依赖安装:

pip install Flask-Session

六、Docker部署配置

创建docker-compose.yml文件,配置Redis服务:

version: '3.8'
services:
  redis:
    image: redis:7-alpine  # 使用轻量版Redis
    ports:
      - "6379:6379"  # 映射端口
    volumes:
      - redis_data:/data  # 持久化数据
    environment:
      - REDIS_PASSWORD={REDIS_PASSWORD}  # 从环境变量读取密码 
    command: redis-server --requirepass
{REDIS_PASSWORD} --appendonly yes  # 开启AOF持久化
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]  # 健康检查
      interval: 10s
      timeout: 5s
      retries: 5
    restart: always  # 自动重启

  web:
    build: .  # 构建应用镜像
    ports:
      - "8000:8000"  # 映射应用端口
    environment:
      - DATABASE_URL={DATABASE_URL} 
      - REDIS_URL=redis://redis:6379/0  # 使用容器名作为Redis主机 
      - REDIS_PASSWORD=
{REDIS_PASSWORD}
      - SECRET_KEY=𝑆𝐸𝐶𝑅𝐸𝑇𝐾𝐸𝑌−𝐴𝐷𝑀𝐼𝑁𝑃𝐴𝑆𝑆𝑊𝑂𝑅𝐷=
{ADMIN_PASSWORD}
    depends_on:
      - redis  # 依赖Redis服务
    restart: always

volumes:
  redis_data:  # Redis数据卷

七、环境变量配置

创建.env.example文件,提供环境变量模板:

# 数据库连接
DATABASE_URL=sqlite:///site.db
# 生产环境示例(MySQL):
# DATABASE_URL=mysql://username:password@db:3306/campus_crowdfunding

# Redis配置
REDIS_URL=redis://localhost:6379/0
REDIS_PASSWORD=your-redis-password-here

# 应用配置
SECRET_KEY=your-secret-key-here
ADMIN_PASSWORD=your-admin-password-here
FIELD_ENCRYPTION_KEY=your-encryption-key-here

复制为.env文件并修改实际值:

cp .env.example .env
# 编辑.env文件,填入实际配置

八、测试与验证

1. 本地测试

启动本地Redis服务(如果未安装Redis,可使用Docker启动):

# 启动Redis容器(本地测试用)
docker run --name redis-test -p 6379:6379 -d redis:7-alpine

运行应用:

python app.py

测试缓存功能:

  • 访问 http://localhost:5000/user/1,第一次会查询数据库
  • 再次访问同一地址,会从缓存返回,响应速度更快

2. 部署测试

使用Docker Compose启动服务:

# 构建并启动服务
docker-compose up -d --build

# 查看服务状态
docker-compose ps

# 查看Redis日志
docker-compose logs redis

# 查看应用日志
docker-compose logs web

验证Redis连接:

# 进入Redis容器
docker exec -it campus_crowdfunding_redis_1 redis-cli -a your-redis-password

# 查看缓存数据
127.0.0.1:6379> keys *
# 应看到类似 "campus_crowdfunding:user_1" 的缓存键

九、性能监控与优化

1. Redis内存监控

使用redis-cli查看内存使用:

docker exec -it campus_crowdfunding_redis_1 redis-cli -a your-redis-password info memory

2. 设置内存限制

docker-compose.yml中添加内存限制:

redis:
  # 其他配置...
  command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru
  • maxmemory 512mb:限制Redis最大内存为512MB
  • maxmemory-policy allkeys-lru:当内存不足时,删除最近最少使用的键

十、错误处理

在代码中添加Redis连接异常处理:

def get_cached_data(key):
    """获取缓存数据,处理Redis异常"""
    try:
        return current_app.redis_client.get(key)
    except redis.RedisError as e:
        # 记录错误
        app.logger.error(f"Redis error: {e}")
        # 降级处理:返回None,后续从数据库获取
        return None

十一、部署后维护

  • 数据备份:定期备份Redis数据(通过docker cp复制持久化文件)
  • 监控:使用RedisInsight等工具监控Redis状态
  • 日志:配置Redis日志级别,便于排查问题

总结

此方案详细覆盖了从本地代码集成到Docker部署的全流程,包含了连接池优化、Flask扩展集成、Docker编排配置等关键细节。通过此方案,您可以在项目中稳定使用Redis提升性能,同时为简历添加中间件运维的亮点。 ———————————————— 版权声明:本文为CSDN博主「南梦浅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/Ly31755/art…