基于Spring Boot与协同过滤算法构建商品推荐系统实战
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在电商平台开发中如何让用户在海量商品中快速找到心仪之物是提升用户粘性和转化率的关键。传统的关键词搜索和分类浏览已难以满足个性化需求而协同过滤推荐算法正是解决这一痛点的核心技术。本文将手把手带你从零开始基于 Spring Boot 和 MySQL构建一个完整的商品推荐系统。无论你是正在寻找毕业设计课题的学生还是希望在实际项目中引入推荐功能的开发者都能从本文获得从原理到落地的完整解决方案。1. 推荐系统与协同过滤算法核心概念在深入代码之前我们有必要理解推荐系统的基本原理和协同过滤算法的核心思想。推荐系统的本质是信息过滤它通过分析用户的历史行为数据如浏览、购买、评分预测用户可能感兴趣的项目如商品、电影、新闻并进行个性化推送。协同过滤算法是推荐系统领域最经典、应用最广泛的算法之一。其核心假设是“相似的用户喜欢相似的东西”或“喜欢相似物品的用户具有相似的品味”。它主要分为两大类基于用户的协同过滤首先找到与目标用户兴趣相似的其他用户邻居然后将这些邻居喜欢的、而目标用户未曾接触过的物品推荐给目标用户。其关键在于计算用户之间的相似度常用方法有余弦相似度、皮尔逊相关系数等。基于物品的协同过滤首先计算物品之间的相似度然后根据用户历史行为中喜欢的物品推荐与这些物品相似的其他物品。这种方法在物品数量相对稳定且少于用户数量的场景下效果更好且推荐结果的可解释性更强。协同过滤算法面临的主要挑战包括冷启动问题新用户或新物品由于缺乏历史行为数据难以找到相似用户或物品。数据稀疏性问题用户-物品评分矩阵通常非常稀疏导致相似度计算不准确。可扩展性问题随着用户和物品数量的增长计算用户或物品相似度的复杂度会急剧增加。理解了这些背景我们就能明白构建一个推荐系统不仅仅是实现算法更需要设计合理的数据模型、高效的存储方案以及可扩展的系统架构来应对这些挑战。2. 项目环境准备与技术栈说明本项目采用当前企业级Java开发的主流技术栈实现前后端分离的架构。以下是构建本系统所需的环境和工具请确保你的开发环境已就绪。后端技术栈Java Development Kit (JDK)版本 8 或 11推荐 11。这是运行Spring Boot应用的基础。Spring Boot版本 2.7.x。它极大地简化了Spring应用的初始搭建和开发过程提供了自动配置、起步依赖等特性。Spring MVC用于构建RESTful API处理HTTP请求和响应。MyBatis-Plus一个强大的MyBatis增强工具在MyBatis的基础上只做增强不做改变简化了CRUD操作。MySQL版本 5.7 或 8.0。作为关系型数据库存储用户、商品及行为数据。Maven版本 3.6。用于项目构建和依赖管理。前端技术栈简要提及本文重点在后端Vue.js 3渐进式JavaScript框架用于构建用户界面。Element Plus基于Vue 3的桌面端组件库。Axios基于Promise的HTTP客户端用于前后端数据通信。开发工具IDEIntelliJ IDEA推荐或 Eclipse。数据库管理工具Navicat、DBeaver或MySQL Workbench。API测试工具Postman或Apifox。版本说明技术迭代迅速本文示例代码和配置基于 Spring Boot 2.7.18 和 MyBatis-Plus 3.5.x 编写。在实际开发中请根据你的项目需求选择合适的版本并注意依赖之间的兼容性。你可以通过 start.spring.io 快速生成一个基础项目骨架。3. 数据库设计与核心表结构推荐系统的数据模型设计至关重要它直接决定了算法实现的效率和准确性。我们主要设计三张核心表用户表、商品表、用户行为表。3.1 用户信息表 (user_info)此表存储系统用户的基本信息是用户身份认证和画像的基础。CREATE TABLE user_info ( user_id bigint NOT NULL AUTO_INCREMENT COMMENT 用户唯一标识主键, user_name varchar(50) NOT NULL COMMENT 用户昵称, user_email varchar(100) NOT NULL COMMENT 用户邮箱, user_password varchar(100) NOT NULL COMMENT 加密后的密码, user_avatar varchar(255) DEFAULT NULL COMMENT 用户头像URL, register_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 注册时间, last_login_time datetime DEFAULT NULL COMMENT 最后登录时间, user_status tinyint NOT NULL DEFAULT 0 COMMENT 用户状态0-正常1-禁用, PRIMARY KEY (user_id), UNIQUE KEY uk_email (user_email), UNIQUE KEY uk_name (user_name) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT用户信息表;设计要点user_id使用BIGINT自增主键满足大规模用户场景。user_password存储的是经过BCrypt等算法加密后的密码切勿明文存储。为user_email和user_name添加唯一约束保证账户唯一性。register_time默认值为当前时间由数据库自动生成。3.2 商品信息表 (product_info)此表存储所有可被推荐的商品信息。CREATE TABLE product_info ( product_id bigint NOT NULL AUTO_INCREMENT COMMENT 商品唯一标识主键, product_name varchar(100) NOT NULL COMMENT 商品名称, product_desc text COMMENT 商品描述, product_price decimal(10,2) NOT NULL COMMENT 商品价格, product_category varchar(50) NOT NULL COMMENT 商品分类, product_image varchar(255) DEFAULT NULL COMMENT 商品图片URL, publish_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 上架时间, stock_quantity int NOT NULL DEFAULT 0 COMMENT 库存数量, PRIMARY KEY (product_id), KEY idx_category (product_category) -- 为分类字段添加索引便于按类查询 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT商品信息表;设计要点product_price使用DECIMAL(10,2)类型精确存储货币金额。product_category字段用于物品分类在基于物品的协同过滤中可以作为计算相似度的辅助特征。为product_category建立普通索引提升按分类查询的效率。3.3 用户行为表 (user_behavior)这是推荐系统的“燃料”表记录了所有用户与商品的交互行为是协同过滤算法计算的基础。CREATE TABLE user_behavior ( behavior_id bigint NOT NULL AUTO_INCREMENT COMMENT 行为唯一标识主键, user_id bigint NOT NULL COMMENT 关联用户ID, product_id bigint NOT NULL COMMENT 关联商品ID, behavior_type tinyint NOT NULL COMMENT 行为类型1-浏览2-收藏3-加入购物车4-购买5-评分, behavior_score int DEFAULT NULL COMMENT 用户评分1-5分仅在behavior_type5时有意义, behavior_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 行为发生时间, PRIMARY KEY (behavior_id), KEY idx_user_product (user_id,product_id), -- 复合索引优化按用户和商品查询 KEY idx_user_time (user_id,behavior_time), -- 复合索引优化按用户和时间段查询 KEY idx_product (product_id), -- 优化按商品查询 CONSTRAINT fk_behavior_user FOREIGN KEY (user_id) REFERENCES user_info (user_id) ON DELETE CASCADE, CONSTRAINT fk_behavior_product FOREIGN KEY (product_id) REFERENCES product_info (product_id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENT用户行为表;设计要点behavior_type用不同的整数值区分行为权重。例如购买行为比浏览行为更能代表用户偏好。在计算用户-物品评分矩阵时可以给不同类型的行为赋予不同的权重值如浏览1购买5。behavior_score是显式评分对于有评分功能的系统如电影、书籍这是最直接的偏好数据。对于电商可能更多依赖隐式反馈行为类型。索引策略该表是高频读写表查询模式主要是WHERE user_id?或WHERE product_id?。因此创建了(user_id, product_id)、(user_id, behavior_time)和(product_id)索引能极大提升查询性能。外键约束通过外键确保数据完整性ON DELETE CASCADE表示当用户或商品被删除时其关联的行为记录也自动删除。4. Spring Boot 后端项目搭建与核心代码实现4.1 创建项目与依赖配置使用 Spring Initializr 或 IDE 创建一个新的 Spring Boot 项目。以下是pom.xml中的关键依赖?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent groupIdcom.example/groupId artifactIdrecommend-system/artifactId version0.0.1-SNAPSHOT/version namerecommend-system/name description基于协同过滤的商品推荐系统/description properties java.version11/java.version mybatis-plus.version3.5.3.1/mybatis-plus.version /properties dependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis Plus -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency !-- MySQL Driver -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- Spring Boot Test -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project4.2 数据层实现 (MyBatis-Plus)首先配置数据库连接在application.yml中spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/recommend_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印SQL生产环境关闭 global-config: db-config: logic-delete-field: isDeleted # 全局逻辑删除字段名如果启用 logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值然后为每张表创建对应的实体类、Mapper接口和Service。以UserBehavior为例实体类 (UserBehavior.java):package com.example.recommendsystem.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; Data TableName(user_behavior) public class UserBehavior { TableId(type IdType.AUTO) private Long behaviorId; private Long userId; private Long productId; private Integer behaviorType; // 1-浏览2-收藏3-购物车4-购买5-评分 private Integer behaviorScore; // 1-5分 TableField(fill FieldFill.INSERT) private LocalDateTime behaviorTime; }Mapper接口 (UserBehaviorMapper.java):package com.example.recommendsystem.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.recommendsystem.entity.UserBehavior; import org.apache.ibatis.annotations.Mapper; Mapper public interface UserBehaviorMapper extends BaseMapperUserBehavior { // 可以在此定义复杂的自定义SQL查询例如查询用户最近N条行为 }Service层 (UserBehaviorService.java):package com.example.recommendsystem.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.recommendsystem.entity.UserBehavior; import java.util.List; import java.util.Map; public interface UserBehaviorService extends IServiceUserBehavior { /** * 获取用户-物品评分矩阵用于协同过滤计算 * return Map用户ID, Map物品ID, 评分 */ MapLong, MapLong, Double getUserItemMatrix(); }ServiceImpl实现 (UserBehaviorServiceImpl.java):package com.example.recommendsystem.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.recommendsystem.entity.UserBehavior; import com.example.recommendsystem.mapper.UserBehaviorMapper; import com.example.recommendsystem.service.UserBehaviorService; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; Service public class UserBehaviorServiceImpl extends ServiceImplUserBehaviorMapper, UserBehavior implements UserBehaviorService { Override public MapLong, MapLong, Double getUserItemMatrix() { ListUserBehavior behaviors this.list(); // 获取所有行为数据生产环境应分页或增量 MapLong, MapLong, Double userItemMatrix new HashMap(); for (UserBehavior behavior : behaviors) { Long userId behavior.getUserId(); Long productId behavior.getProductId(); // 计算综合评分行为类型权重 * (显式评分或默认值) double score calculateScore(behavior); userItemMatrix.computeIfAbsent(userId, k - new HashMap()) .put(productId, score); } return userItemMatrix; } private double calculateScore(UserBehavior behavior) { // 这是一个简化的评分计算逻辑 // 可以根据业务需求调整权重 double typeWeight 1.0; switch (behavior.getBehaviorType()) { case 1: // 浏览 typeWeight 0.2; break; case 2: // 收藏 typeWeight 0.5; break; case 3: // 购物车 typeWeight 0.7; break; case 4: // 购买 typeWeight 1.0; break; case 5: // 评分 // 如果有显式评分则直接使用归一化到0-1 if (behavior.getBehaviorScore() ! null) { return behavior.getBehaviorScore() / 5.0; // 假设5分制 } break; } // 对于非评分行为给予一个基础分乘以权重 return 0.5 * typeWeight; } }4.3 协同过滤算法核心实现我们实现一个基于物品的协同过滤算法服务。其核心步骤是1) 构建用户-物品评分矩阵2) 计算物品相似度矩阵3) 为目标用户生成推荐。算法服务类 (ItemCFRecommendService.java):package com.example.recommendsystem.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.*; import java.util.stream.Collectors; Service public class ItemCFRecommendService { Autowired private UserBehaviorService userBehaviorService; // 用户-物品评分矩阵: MapuserId, MapproductId, score private MapLong, MapLong, Double userItemMatrix; // 物品相似度矩阵: MapproductId, MapproductId, similarity private MapLong, MapLong, Double itemSimilarityMatrix; /** * 初始化加载数据并计算物品相似度可定时刷新 */ PostConstruct public void init() { refreshData(); } public void refreshData() { userItemMatrix userBehaviorService.getUserItemMatrix(); calculateItemSimilarities(); } /** * 计算物品之间的余弦相似度 */ private void calculateItemSimilarities() { itemSimilarityMatrix new HashMap(); // 获取所有物品ID SetLong allItemIds new HashSet(); for (MapLong, Double itemScores : userItemMatrix.values()) { allItemIds.addAll(itemScores.keySet()); } ListLong itemList new ArrayList(allItemIds); for (int i 0; i itemList.size(); i) { Long itemI itemList.get(i); for (int j i; j itemList.size(); j) { Long itemJ itemList.get(j); if (itemI.equals(itemJ)) { // 自身相似度为1 itemSimilarityMatrix.computeIfAbsent(itemI, k - new HashMap()).put(itemJ, 1.0); } else { double similarity cosineSimilarity(itemI, itemJ); if (similarity 0) { // 只存储正相似度减少存储和计算量 itemSimilarityMatrix.computeIfAbsent(itemI, k - new HashMap()).put(itemJ, similarity); itemSimilarityMatrix.computeIfAbsent(itemJ, k - new HashMap()).put(itemI, similarity); } } } } } /** * 计算两个物品的余弦相似度 */ private double cosineSimilarity(Long itemI, Long itemJ) { double dotProduct 0.0; double normI 0.0; double normJ 0.0; // 遍历所有用户计算两个物品评分向量的点积和模长 for (MapLong, Double userRatings : userItemMatrix.values()) { Double ratingI userRatings.get(itemI); Double ratingJ userRatings.get(itemJ); if (ratingI ! null ratingJ ! null) { dotProduct ratingI * ratingJ; normI ratingI * ratingI; normJ ratingJ * ratingJ; } else if (ratingI ! null) { normI ratingI * ratingI; } else if (ratingJ ! null) { normJ ratingJ * ratingJ; } } if (normI 0 || normJ 0) { return 0.0; } return dotProduct / (Math.sqrt(normI) * Math.sqrt(normJ)); } /** * 为目标用户生成推荐商品列表 * param userId 目标用户ID * param topN 返回推荐商品的数量 * return 推荐商品ID及其预测兴趣度列表 */ public ListMap.EntryLong, Double recommendItems(Long userId, int topN) { MapLong, Double userRatings userItemMatrix.getOrDefault(userId, new HashMap()); // 用户已经有过行为的物品 SetLong interactedItems userRatings.keySet(); // 预测用户对未交互物品的兴趣度 MapLong, Double predictions new HashMap(); for (Long itemJ : itemSimilarityMatrix.keySet()) { if (!interactedItems.contains(itemJ)) { double score predictRating(userId, itemJ, userRatings); if (score 0) { predictions.put(itemJ, score); } } } // 按预测分排序取TopN return predictions.entrySet().stream() .sorted((e1, e2) - Double.compare(e2.getValue(), e1.getValue())) .limit(topN) .collect(Collectors.toList()); } /** * 预测用户对某个物品的兴趣度 * 公式: pred(u, i) sum_{j in N(i)} sim(i, j) * r(u, j) / sum_{j in N(i)} |sim(i, j)| * 其中 N(i) 是与物品i最相似的K个物品且用户u对j有评分 */ private double predictRating(Long userId, Long targetItemId, MapLong, Double userRatings) { MapLong, Double similarities itemSimilarityMatrix.get(targetItemId); if (similarities null || similarities.isEmpty()) { return 0.0; } double numerator 0.0; double denominator 0.0; int k 20; // 取最相似的20个物品进行计算 // 获取与目标物品最相似的K个物品且用户有评分 ListMap.EntryLong, Double topSimilarItems similarities.entrySet().stream() .filter(e - userRatings.containsKey(e.getKey())) // 用户对该相似物品有行为 .sorted((e1, e2) - Double.compare(e2.getValue(), e1.getValue())) .limit(k) .collect(Collectors.toList()); for (Map.EntryLong, Double entry : topSimilarItems) { Long similarItemId entry.getKey(); Double similarity entry.getValue(); Double userRating userRatings.get(similarItemId); numerator similarity * userRating; denominator Math.abs(similarity); } if (denominator 0) { return 0.0; } return numerator / denominator; } }4.4 控制器层与API暴露创建一个RESTful API控制器供前端调用获取推荐结果。推荐控制器 (RecommendController.java):package com.example.recommendsystem.controller; import com.example.recommendsystem.service.ItemCFRecommendService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; import java.util.stream.Collectors; RestController RequestMapping(/api/recommend) public class RecommendController { Autowired private ItemCFRecommendService itemCFRecommendService; /** * 获取基于物品的协同过滤推荐 * param userId 用户ID * param topN 推荐数量默认10 * return 推荐商品ID列表 */ GetMapping(/item-cf) public ListLong getItemCFRecommendations(RequestParam Long userId, RequestParam(defaultValue 10) Integer topN) { ListMap.EntryLong, Double recommendations itemCFRecommendService.recommendItems(userId, topN); // 只返回商品ID列表前端可根据ID查询商品详情 return recommendations.stream() .map(Map.Entry::getKey) .collect(Collectors.toList()); } /** * 手动触发更新推荐模型例如定时任务或管理员操作 */ GetMapping(/refresh-model) public String refreshModel() { itemCFRecommendService.refreshData(); return Recommendation model refreshed successfully!; } }5. 系统运行、测试与效果验证5.1 启动项目与数据准备在MySQL中创建数据库recommend_db并执行第3节提供的SQL脚本建表。在application.yml中配置正确的数据库连接信息。运行Spring Boot主类RecommendSystemApplication。通过接口或数据库工具向user_info、product_info表插入一些模拟数据并向user_behavior表插入用户行为记录模拟用户浏览、购买等。5.2 API测试使用Postman测试推荐接口请求URL:GET http://localhost:8080/api/recommend/item-cf?userId1topN5预期响应:[101, 205, 78, 332, 456](商品ID列表)5.3 算法效果初步分析为了验证算法是否工作可以编写一个简单的测试类打印出相似度矩阵或某个用户的推荐结果及预测分数观察其合理性。例如用户A购买了手机和耳机那么算法应该会推荐与手机和耳机相似的商品如手机壳、充电宝等。6. 常见问题与性能优化方案在实际开发和部署中你可能会遇到以下问题问题现象可能原因解决方案与优化思路推荐结果不准确或重复1. 数据稀疏用户行为太少。2. 相似度计算未考虑热门物品惩罚。3. 冷启动用户/物品。1.数据增强引入物品属性分类、标签计算混合相似度。2.热门惩罚在相似度计算中引入逆用户频率IUF或采用改进的余弦相似度。3.混合推荐对于冷启动结合基于内容的推荐根据物品属性或热门排行榜。接口响应慢1. 用户/物品数量大实时计算相似度耗时。2. 每次请求都全量计算。1.离线计算使用定时任务如Spring Scheduler、Quartz在后台离线计算物品相似度矩阵并存入Redis或数据库。API直接查询预计算的结果。2.增量更新并非每次全量重算只更新受新行为影响的部分相似度。3.缓存结果将用户的推荐结果缓存一段时间如Redis设置10分钟过期。内存溢出 (OOM)用户-物品矩阵或物品相似度矩阵过大全量加载到内存。1.分片计算将用户或物品分组分别计算组内相似度。2.使用稀疏矩阵库如Mahout、Spark MLlib中的稀疏矩阵数据结构。3.分布式计算对于超大规模数据迁移到Spark、Flink等分布式计算框架。新用户/新物品无推荐冷启动问题。1.非个性化推荐新用户展示热门商品、最新商品或随机商品。2.注册信息利用新用户注册时选择兴趣标签进行基于内容的推荐。3.探索与利用在推荐结果中混入一定比例的新物品或随机物品收集反馈数据。7. 生产环境最佳实践与扩展方向将推荐系统从Demo推向生产环境需要考虑更多工程化问题。1. 架构升级离线/近线/在线三层架构离线层每天定时运行Spark/MapReduce作业在全量数据上训练模型计算全局物品相似度结果存入HBase或Redis。近线层使用Flink处理实时数据流实时更新用户的最新行为并快速更新用户特征向量实现分钟级甚至秒级的模型微调。在线层接收请求从缓存中加载离线模型和近线用户特征进行快速推荐计算如上面实现的predictRating函数并返回结果。2. 数据管道与特征工程建立稳定的数据管道将业务数据库MySQL中的用户行为日志实时同步到数据仓库如Hive或消息队列如Kafka中供离线/近线层消费。除了行为数据融入更多特征用户画像年龄、性别、地域、物品属性类别、价格、品牌、上下文信息时间、地点、设备使用更复杂的模型如矩阵分解SVD、ALS、深度学习Wide Deep、DeepFM。3. 评估与AB测试定义明确的评估指标准确率、召回率、F1值、覆盖率、新颖性、多样性。搭建AB测试平台将新的推荐算法与旧算法或基线算法进行线上对比通过点击率CTR、转化率CVR、人均观看时长等业务指标判断优劣。4. 系统监控与告警监控关键指标推荐接口的QPS、响应时间P99、错误率。监控算法指标推荐结果的覆盖率、热门物品占比防止算法退化。设置告警当指标异常时及时通知研发人员。5. 代码层面的优化建议相似度计算优化上述代码的calculateItemSimilarities复杂度是O(n²)对于大量物品不可行。生产环境应采用基于采样的方法或使用近似最近邻ANN算法库如Facebook的Faiss。使用缓存使用Redis缓存热门物品的相似物品列表、用户的实时推荐结果。服务化与解耦将推荐算法模块单独部署为微服务Recommendation Service通过RPC或HTTP与其他服务通信提高系统可扩展性和可维护性。构建一个高效、准确的推荐系统是一个持续迭代和优化的过程。本文提供的基于Spring Boot和协同过滤的实现为你打下了一个坚实的起点。你可以在此基础上逐步引入更复杂的算法、更完善的架构和更智能的策略最终打造出驱动业务增长的核心引擎。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度