1. 项目背景与核心价值
校园美食推荐系统是当前高校信息化建设中的一个实用型项目。作为一名在校园信息化领域工作多年的开发者,我见过太多学生每天为"吃什么"而纠结的场景。传统的人工推荐方式效率低下,而市面上主流的外卖平台又缺乏针对校园场景的优化。这正是我们开发这个系统的初衷。
这个系统的核心价值在于:
- 利用K-means算法实现个性化推荐,解决"选择困难症"
- 整合校园周边餐饮资源,建立专属美食数据库
- 通过用户行为分析,为食堂改进提供数据支持
- 搭建校园美食社区,促进吃货间的交流分享
2. 技术架构设计
2.1 整体技术选型
经过多次技术论证,我们最终确定了以下技术栈:
- 后端:Spring Boot 2.7 + MyBatis Plus
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0
- 推荐算法:K-means聚类
- 部署:Docker + Nginx
选择这些技术主要基于以下考虑:
- Spring Boot的自动配置和起步依赖能大幅减少配置工作
- Vue 3的Composition API更适合复杂交互场景
- MySQL在校园级应用中的性能和稳定性已经足够
- K-means算法简单高效,适合初期推荐系统
2.2 系统架构图
code复制[客户端层]
│
▼
[API网关层] → [认证服务]
│
▼
[业务服务层] → [推荐服务]
│
▼
[数据持久层] → [缓存层]
│
▼
[MySQL数据库]
3. 核心功能实现
3.1 用户行为采集模块
要实现精准推荐,首先需要完整采集用户行为数据。我们在前端埋点了以下事件:
javascript复制// 前端埋点示例
trackEvent('VIEW_FOOD', {foodId: 123})
trackEvent('COLLECT', {foodId: 123})
trackEvent('COMMENT', {foodId: 123, rating: 5})
后端使用Kafka接收这些事件数据,通过Flink进行实时处理后存入HBase。这种架构可以支持每天百万级的事件处理。
3.2 K-means推荐算法实现
核心算法代码如下:
java复制public class KMeansRecommender {
// 初始化聚类中心
public List<ClusterCenter> initCenters(int k, List<UserVector> users) {
// 使用k-means++算法优化初始中心选择
}
// 执行聚类
public List<FoodRecommendation> recommend(User user, int topN) {
// 1. 加载用户历史行为
// 2. 计算用户特征向量
// 3. 找到最近的聚类中心
// 4. 返回该聚类中最受欢迎的食物
}
}
算法调优过程中我们发现:
- 将用户浏览、收藏、评分行为赋予不同权重效果更好
- 每周重新训练模型能保持推荐新鲜度
- 聚类数k=7时轮廓系数最高
3.3 高性能缓存设计
为了应对用餐高峰期的访问压力,我们设计了三级缓存:
- 本地缓存:Caffeine缓存热门美食信息,TTL=5分钟
- 分布式缓存:Redis缓存用户个性化推荐结果,TTL=1小时
- CDN缓存:静态资源通过CDN加速
缓存更新策略采用"先更新数据库,再删除缓存"的方式,避免缓存一致性问题。
4. 关键问题与解决方案
4.1 冷启动问题
新用户没有历史数据时,我们采用以下策略:
- 基于地理位置推荐附近热门
- 问卷调查获取初始口味偏好
- 结合院系专业推荐(如医学院学生更关注健康餐)
4.2 数据稀疏性问题
针对用户-食物评分矩阵稀疏的问题:
- 引入食物特征(辣度、价格等)补充协同过滤
- 使用SVD++算法增强矩阵分解
- 设置默认评分(浏览=1,收藏=3,评论=5)
4.3 系统性能优化
通过JMeter压测发现的主要瓶颈及解决方案:
| 瓶颈点 | QPS | 优化方案 | 优化后QPS |
|---|---|---|---|
| 推荐接口 | 120 | 增加缓存 | 850 |
| 详情查询 | 200 | 读写分离 | 600 |
| 评论提交 | 80 | 异步处理 | 300 |
5. 部署与运维实践
5.1 CI/CD流水线
我们使用GitLab CI实现自动化部署:
yaml复制stages:
- test
- build
- deploy
maven-build:
stage: build
script:
- mvn clean package -DskipTests
artifacts:
paths:
- target/*.jar
5.2 监控告警体系
Prometheus监控指标包括:
- 接口响应时间(P99<500ms)
- JVM内存使用(<70%)
- MySQL连接数(<80%)
- 推荐点击率(>15%)
当指标异常时通过企业微信机器人告警。
6. 项目成果与反思
系统上线3个月后的关键数据:
- 注册用户:12,345人
- 日活用户:3,200+
- 推荐点击率:18.7%
- 食堂投诉下降:43%
经验教训:
- 初期低估了图片存储需求,后期不得不迁移到OSS
- 没有预见到某些美食的"网红效应",导致推荐失衡
- 移动端适配不够完善,影响了用户体验
未来计划:
- 引入深度学习提升推荐精度
- 增加外卖比价功能
- 开发微信小程序版本
