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

相关推荐
阿kun要赚马内1 小时前
操作系统:线程与进程
java·开发语言·jvm
pupudawang2 小时前
如何查询SQL Server数据库服务器的IP地址
java
SimonKing2 小时前
IntelliJ IDEA 配置与插件全部迁移到其他盘,彻底释放C盘空间
java·后端·程序员
华科易迅2 小时前
Spring 代理
java·后端·spring
我真会写代码2 小时前
深度解析ConcurrentHashMap:从底层原理到生产实战,搞定并发安全映射(含面试避坑)
java·并发编程
liangdabiao2 小时前
XHS_Business_Idea_Validator-小红书解析市场机会智能体
java·ide·intellij-idea
深蓝轨迹2 小时前
Redis 分布式锁实现流程
数据库·redis·分布式
xnian_2 小时前
高并发下锁管理器,单机与分布式版
java·开发语言
凌波粒2 小时前
LeetCode--203.移除链表元素(链表)
java·算法·leetcode·链表