网站redis从开发到部署方案

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

**一、项目结构准备**

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

```

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

```

安装依赖:

```bash

pip install -r requirements.txt

```

**三、配置文件设置**

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

```python

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:

```python

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`中使用缓存装饰器:

```python

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`中添加计数器功能:

```python

@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存储会话:

```python

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)

```

依赖安装:

```bash

pip install Flask-Session

```

**六、Docker部署配置**

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

```yaml

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=${SECRET_KEY}

  • ADMIN_PASSWORD=${ADMIN_PASSWORD}

depends_on:

  • redis # 依赖Redis服务

restart: always

volumes:

redis_data: # Redis数据卷

```

**七、环境变量配置**

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

```env

数据库连接

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`文件并修改实际值:

```bash

cp .env.example .env

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

```

**八、测试与验证**

**1. 本地测试**

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

```bash

启动Redis容器(本地测试用)

docker run --name redis-test -p 6379:6379 -d redis:7-alpine

```

运行应用:

```bash

python app.py

```

测试缓存功能:

**2. 部署测试**

使用Docker Compose启动服务:

```bash

构建并启动服务

docker-compose up -d --build

查看服务状态

docker-compose ps

查看Redis日志

docker-compose logs redis

查看应用日志

docker-compose logs web

```

验证Redis连接:

```bash

进入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`查看内存使用:

```bash

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

```

**2. 设置内存限制**

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

```yaml

redis:

其他配置...

command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru

```

  • `maxmemory 512mb`:限制Redis最大内存为512MB

  • `maxmemory-policy allkeys-lru`:当内存不足时,删除最近最少使用的键

**十、错误处理**

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

```python

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提升性能,同时为简历添加中间件运维的亮点。

相关推荐
Devin~Y1 天前
大厂内容社区面试实录:从 Spring Boot 微服务到 AI RAG 问答(附详细解析)
java·spring boot·redis·elasticsearch·spring cloud·微服务·kafka
Lenyiin1 天前
Python数据类型与运算符:深入理解Python世界的基石
java·开发语言·python
fīɡЙtīиɡ ℡1 天前
【SpringAi最新版入门(二)】
java·javascript·css·人工智能·css3
小江的记录本1 天前
【大语言模型】大语言模型——核心概念(预训练、SFT监督微调、RLHF/RLAIF对齐、Token、Embedding、上下文窗口)
java·人工智能·后端·python·算法·语言模型·自然语言处理
念越1 天前
算法每日一题 Day01|双指针解决移动零问题
java·算法·力扣
敖正炀1 天前
StampedLock 详解
java·后端
AllData公司负责人1 天前
AllData数据中台集成开源项目Apache Doris建设实时数仓平台
java·大数据·数据库·数据仓库·apache doris·实时数仓平台·doris集群
白宇横流学长1 天前
助农产品在线交易平台设计与实现【源码+文档】
java
han_hanker1 天前
Spring Boot 如何读取 application.yml 作为配置
java·spring boot·后端
Milu_Jingyu1 天前
sqlite3_prepare_v2 与 sqlite3_exec 在 SQLite 中的核心区别
java·数据库·sqlite