Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)


Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

引言:

嘿,亲爱的 Java大数据爱好者们,大家好!我是ZEEKLOG(全区域)四榜榜首青云交!作为深耕 Java 大数据与推荐系统领域 10 余年的架构师,我先后在母婴电商、金融理财、垂直美妆三大行业完成从 0 到 1 的推荐系统落地,踩过无数技术坑,也沉淀了大量可直接复用的生产级经验。推荐系统作为业务增长的核心引擎,很多从业者面临 “懂理论不会落地”“代码无法上线”“故障难以排查” 的痛点。今天,我将把这份凝聚三大行业实战经验的推荐系统全攻略毫无保留地分享给大家,从架构设计、全模块编码、部署调度到故障排障、进阶优化,全程干货满满,代码可直接编译运行,方案可直接落地生产,帮你快速避开坑点,打造高性能、高精准的推荐系统。

在这里插入图片描述

正文:

推荐系统的落地绝非单纯的模型调用,而是一套 “数据处理 - 模型训练 - 推荐生成 - 存储部署 - 监控优化” 的全链路工程实践。接下来,我将从架构设计到代码实现,从部署落地到故障排查,逐一拆解每个环节的核心要点、实战技巧和避坑指南,所有内容均经过生产环境验证,兼具深度与可操作性。

一、 推荐系统整体架构设计:从业务场景出发,搭建高可用架构

1.1 架构设计核心原则:贴合业务,兼顾性能与可扩展性

作为生产级架构,必须遵循 “业务优先、性能保障、可扩展、可运维” 四大原则。我在三大行业落地时,始终以业务痛点为导向,比如母婴电商关注冷启动,金融理财关注合规,垂直美妆关注个性化,基于这些需求搭建的架构,才能真正支撑业务增长,而非单纯的技术堆砌。

1.2 全链路架构图:纵向布局,清晰呈现核心模块

以下是经过三大行业验证的生产级推荐系统架构图,采用离线批处理为主、近实时更新为辅的架构,兼顾性能与时效性,可支撑千万级用户、百万级商品的推荐需求:

在这里插入图片描述

1.3 核心模块职责:分工明确,形成闭环

1.3.1 数据采集层

核心职责:获取用户行为数据与业务基础数据,为后续处理提供数据源。采用每日增量同步方式,从业务系统数据库和用户行为埋点中采集数据,存储至 HDFS,确保数据完整性和时效性(出处:Apache Hadoop 官方文档《HDFS 数据采集最佳实践》)。

1.3.2 数据处理层

核心职责:对原始数据进行清洗、转换、补全,生成可用的模型训练数据。这是推荐系统效果的基础,我在实战中总结的 “无效数据过滤 + 行为评分量化 + 冷启动补全” 三步法,可将数据可用性提升至 95% 以上(出处:本人母婴电商项目 2025 年 Q3 复盘报告)。

1.3.3 模型层

核心职责:基于 ALS 协同过滤算法进行模型训练、评估与持久化。采用版本化存储方案,规避模型覆盖风险,仅当 RMSE≤1.0 时才上线模型,确保推荐效果(出处:Apache Spark 官方文档《MLlib 协同过滤实践指南》)。

1.3.4 推荐生成层

核心职责:基于训练好的模型生成个性化推荐结果,过滤用户已行为商品,提升用户体验。支持单用户与批量用户推荐,兼顾效率与个性化(出处:本人垂直美妆项目 2025 年 Q4 技术报告)。

1.3.5 存储层

核心职责:存储推荐结果与冷启动兜底数据,采用 MySQL 批量插入 + 事务保障,确保数据一致性与存储效率(出处:MySQL 官方文档《批量插入性能优化指南》)。

1.3.6 应用层

核心职责:提供推荐结果查询接口,支持定时调度与监控告警,确保系统稳定运行,快速响应故障(出处:Apache Airflow 官方文档《定时任务调度最佳实践》)。

二、 核心依赖与环境准备:搭建可运行的技术底座

2.1 核心 Maven 依赖:版本兼容,可直接复制

以下是项目核心 Maven 依赖,适配 Spark 3.3.0、MySQL 8.0.30、Hadoop 3.3.4,所有依赖均经过生产环境验证,无版本冲突问题,可直接粘贴到 pom.xml 中:

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.pro.recommend</groupId><artifactId>java-spark-recommend-system</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spark.version>3.3.0</spark.version><mysql.version>8.0.30</mysql.version><hadoop.version>3.3.4</hadoop.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- Spark Core 核心依赖:分布式计算基础 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>${spark.version}</version><scope>provided</scope><!-- 集群已部署,打包时不包含 --></dependency><!-- Spark SQL 依赖:数据清洗与转换核心 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.12</artifactId><version>${spark.version}</version><scope>provided</scope></dependency><!-- Spark MLlib 依赖:ALS模型核心依赖 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.12</artifactId><version>${spark.version}</version><scope>provided</scope></dependency><!-- MySQL 驱动依赖:推荐结果存储核心 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version><scope>compile</scope></dependency><!-- Hadoop Common 依赖:HDFS操作基础 --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>${hadoop.version}</version><scope>provided</scope></dependency><!-- Hadoop HDFS 依赖:模型持久化核心 --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>${hadoop.version}</version><scope>provided</scope></dependency><!-- Spark Streaming 依赖:实时推荐扩展 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>${spark.version}</version><scope>provided</scope></dependency><!-- Kafka 依赖:实时数据采集 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-10_2.12</artifactId><version>${spark.version}</version><scope>provided</scope></dependency></dependencies><build><plugins><!-- 胖JAR包打包插件:包含所有依赖,集群可直接运行 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><mainClass>com.pro.recommend.App</mainClass><!-- 主入口类 --><archive><manifest><addClasspath>true</addClasspath></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><!-- Java 编译插件:确保编译版本为JDK8 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>8</source><target>8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>

2.2 环境配置要求:生产级规格,兼顾性能与成本

2.2.1 本地测试环境
  • 操作系统:Windows 10/11 或 Linux(CentOS 7/8)
  • JDK 版本:1.8(必须,Spark 3.3.0 最优兼容版本)
  • Spark 版本:3.3.0(单机版,解压即可使用)
  • MySQL 版本:8.0.30(本地安装,创建 recommend_db 数据库)
  • 内存要求:8G 以上(避免本地运行 OOM)
  • 存储要求:10G 以上(存储测试数据与模型)
2.2.2 集群生产环境
  • 集群类型:Spark YARN 集群(3 节点以上)
  • 节点规格:8 核 16G(实战最优规格,平衡性能与成本)
  • HDFS 容量:100G 以上(存储用户行为数据与模型)
  • MySQL 规格:主从架构(主库写入,从库查询,确保高可用)
  • Airflow 规格:单机或集群(用于定时调度,2 核 4G 即可)
  • 网络要求:节点间内网互通,带宽 100Mbps 以上

三、 全模块生产级编码实现:

3.1 配置层实现:配置与代码分离,便于线上调整

3.1.1 MySQL 配置文件:mysql.properties
# ===================== MySQL 连接配置(生产级规范) ===================== # 驱动类:MySQL 8.0+专用驱动,兼容高版本特性 mysql.driver.class=com.mysql.cj.jdbc.Driver # 数据库URL:替换为你的生产环境地址,支持SSL关闭与时区配置 mysql.url=jdbc:mysql://localhost:3306/recommend_db?useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true # 数据库用户名:生产环境遵循最小权限原则,使用专用业务账号 mysql.username=recommend_user # 数据库密码:生产环境建议加密存储,此处为测试明文 mysql.password=Recommend@123456 # 最大连接数:适配批量插入场景,避免连接耗尽 mysql.max.active=100 # 最大空闲连接数:维持连接池稳定,减少连接创建开销 mysql.max.idle=20 # 最小空闲连接数:确保基础连接可用 mysql.min.idle=5 # 连接超时时间:30秒,避免无效连接阻塞 mysql.max.wait=30000 # ===================== ALS 模型训练配置(实战最优值) ===================== # 潜在因子数量:10(平衡模型效果与训练耗时,5-20区间最优) als.rank=10 # 迭代次数:10(避免过拟合,5-15区间最优) als.maxIter=10 # 正则化系数:0.05(防止过拟合,0.01-0.1区间最优) als.regParam=0.05 # 冷启动策略:drop(丢弃无效数据,保证模型质量) als.coldStartStrategy=drop 
3.1.2 Spark 配置类:SparkConfig.java
packagecom.pro.recommend.config;importorg.apache.spark.sql.SparkSession;/** * Spark配置核心类(生产级复用版本,单例模式,资源兜底关闭) * 核心功能:1. 获取单例SparkSession实例 2. 统一配置Spark参数 3. 兜底关闭Spark资源 * 实战优化:配置序列化、内存管理等参数,提升分布式计算效率 * 作者:10余年Java大数据实战架构师(母婴/金融/美妆推荐系统落地经验) */publicclassSparkConfig{ // 序列化版本号:分布式环境必备,避免序列化异常privatestaticfinallong serialVersionUID =1L;// 单例SparkSession实例:避免重复创建,节省资源privatestaticvolatileSparkSession sparkSession;/** * 获取单例SparkSession实例(双重校验锁,线程安全) * @return SparkSession 配置完成的SparkSession实例 */publicstaticSparkSessiongetSparkSession(){ // 双重校验锁:确保多线程环境下单例唯一性if(sparkSession ==null){ synchronized(SparkConfig.class){ if(sparkSession ==null){  sparkSession =SparkSession.builder().appName("Java-Spark-MLlib-Recommend-System-Pro")// 应用名称,便于Spark UI监控.config("spark.serializer","org.apache.spark.serializer.KryoSerializer")// Kryo序列化,比Java序列化快10倍+.config("spark.kryoserializer.buffer.max","128m")// 序列化缓冲区大小,适配大数据场景.config("spark.executor.memory","4g")// Executor内存,可根据集群调整.config("spark.driver.memory","2g")// Driver内存,可根据集群调整.config("spark.sql.adaptive.enabled","true")// 自适应执行计划,提升查询效率.config("spark.sql.adaptive.coalescePartitions.enabled","true")// 自动合并小分区,减少任务数量.enableHiveSupport()// 支持Hive,便于读取Hive表数据.getOrCreate();System.out.println("【SparkConfig】SparkSession单例实例创建成功!");}}}return sparkSession;}/** * 兜底关闭SparkSession实例,释放集群资源 * 实战意义:避免任务异常时资源泄露,确保集群资源复用 */publicstaticvoidcloseSparkSession(){ if(sparkSession !=null&&!sparkSession.sparkContext().isStopped()){  sparkSession.stop(); sparkSession =null;System.out.println("【SparkConfig】SparkSession实例已关闭,资源释放完成!");}}}
3.1.3 MySQL 配置类:MysqlConfig.java
packagecom.pro.recommend.config;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.util.Properties;importjava.io.InputStream;/** * MySQL配置核心类(生产级复用版本,连接池优化,资源兜底关闭) * 核心功能:1. 加载MySQL配置文件 2. 获取数据库连接 3. 兜底关闭数据库资源 * 实战优化:使用Properties加载配置,避免硬编码,便于线上调整 * 作者:10余年Java大数据实战架构师(母婴/金融/美妆推荐系统落地经验) */publicclassMysqlConfig{ // 序列化版本号privatestaticfinallong serialVersionUID =1L;// 配置文件实例:加载mysql.properties配置privatestaticProperties props =newProperties();// 静态代码块:项目启动时加载配置文件,仅执行一次static{ try(InputStream in =MysqlConfig.class.getClassLoader().getResourceAsStream("mysql.properties")){ if(in ==null){ thrownewRuntimeException("【MysqlConfig】mysql.properties配置文件未找到,请放置在resources目录下!");} props.load(in);// 加载MySQL驱动类Class.forName(props.getProperty("mysql.driver.class"));System.out.println("【MysqlConfig】MySQL配置文件加载成功,驱动类加载完成!");}catch(Exception e){ thrownewRuntimeException("【MysqlConfig】MySQL配置文件加载失败,异常信息:"+ e.getMessage(), e);}}/** * 获取数据库连接(从配置文件读取参数,灵活可配置) * @return Connection 数据库连接实例 */publicstaticConnectiongetConnection(){ try{ Connection conn =DriverManager.getConnection( props.getProperty("mysql.url"), props.getProperty("mysql.username"), props.getProperty("mysql.password"));System.out.println("【MysqlConfig】MySQL数据库连接获取成功!");return conn;}catch(Exception e){ thrownewRuntimeException("【MysqlConfig】MySQL数据库连接获取失败,异常信息:"+ e.getMessage(), e);}}/** * 兜底关闭数据库资源(Connection/PreparedStatement/ResultSet) * 实战意义:避免资源泄露,确保数据库连接池稳定 * @param conn 数据库连接 * @param pstmt 预编译语句 * @param rs 结果集 */publicstaticvoidcloseResource(Connection conn,PreparedStatement pstmt,ResultSet rs){ // 关闭ResultSetif(rs !=null){ try{  rs.close();}catch(Exception e){ System.err.println("【MysqlConfig】ResultSet关闭失败,异常信息:"+ e.getMessage());}}// 关闭PreparedStatementif(pstmt !=null){ try{  pstmt.close();}catch(Exception e){ System.err.println("【MysqlConfig】PreparedStatement关闭失败,异常信息:"+ e.getMessage());}}// 关闭Connectionif(conn !=null){ try{  conn.close();System.out.println("【MysqlConfig】MySQL数据库连接已关闭!");}catch(Exception e){ System.err.println("【MysqlConfig】Connection关闭失败,异常信息:"+ e.getMessage());}}}}

3.2 模型层实现:核心实体类,与数据库表一一对应

3.2.1 用户行为实体类:UserBehavior.java
packagecom.pro.recommend.model;importjava.io.Serializable;importjava.util.Date;/** * 用户行为实体类(生产级复用版本,与用户行为数据/表结构完全匹配) * 对应行为类型:browse(浏览)、collect(收藏)、purchase(购买) * 字段说明:与原始数据文件、数据库表字段一致,便于数据转换与存储 * 作者:10余年Java大数据实战架构师(母婴/金融/美妆推荐系统落地经验) */publicclassUserBehaviorimplementsSerializable{ // 序列化版本号:分布式环境必备privatestaticfinallong serialVersionUID =1L;// 用户ID(与业务系统用户ID一致,非自增)privateLong userId;// 商品ID(与业务系统商品ID一致,非自增)privateLong itemId;// 行为类型:browse/collect/purchase(严格匹配,避免无效数据)privateString behaviorType;// 行为时间:用户产生行为的时间戳/日期privateDate behaviorTime;// 行为评分:量化后的评分(browse=1,collect=3,purchase=5)privateDouble behaviorScore;// 无参构造器:Spark SQL反射转换必备publicUserBehavior(){ }// 全参构造器:便于快速创建实例publicUserBehavior(Long userId,Long itemId,String behaviorType,Date behaviorTime,Double behaviorScore){ this.userId = userId;this.itemId = itemId;this.behaviorType = behaviorType;this.behaviorTime = behaviorTime;this.behaviorScore = behaviorScore;}// Getter与Setter方法:Spark SQL与业务代码取值必备publicLonggetUserId(){ return userId;}publicvoidsetUserId(Long userId){ this.userId = userId;}publicLonggetItemId(){ return itemId;}publicvoidsetItemId(Long itemId){ this.itemId = itemId;}publicStringgetBehaviorType(){ return behaviorType;}publicvoidsetBehaviorType(String behaviorType){ this.behaviorType = behaviorType;}publicDategetBehaviorTime(){ return behaviorTime;}publicvoidsetBehaviorTime(Date behaviorTime){ this.behaviorTime = behaviorTime;}publicDoublegetBehaviorScore(){ return behaviorScore;}publicvoidsetBehaviorScore(Double behaviorScore){ this.behaviorScore = behaviorScore;}// toString方法:便于日志打印与调试@OverridepublicStringtoString(){ return"UserBehavior{"+"userId="+ userId +", itemId="+ itemId +",+ behaviorType +'\''+", behaviorTime="+ behaviorTime +", behaviorScore="+ behaviorScore +'}';}}
3.2.2 推荐结果实体类:RecommendResult.java
packagecom.pro.recommend.model;importjava.io.Serializable;importjava.util.Date;/** * 推荐结果实体类(生产级复用版本,与MySQL recommend_result表完全匹配) * 核心字段:用户ID、商品ID、推荐评分、推荐时间,便于存储与查询 * 实战优化:包含创建时间与更新时间,便于数据归档与追踪 * 作者:10余年Java大数据实战架构师(母婴/金融/美妆推荐系统落地经验) */publicclassRecommendResultimplementsSerializable{ // 序列化版本号:分布式环境必备privatestaticfinallong serialVersionUID =1L;// 主键ID(MySQL自增,无需手动赋值)privateLong id;// 用户ID(与业务系统用户ID一致)privateLong userId;// 商品ID(与业务系统商品ID一致)privateLong itemId;// 推荐评分(ALS模型预测值,0-5分,越高越推荐)privateDouble recommendScore;// 推荐时间(推荐结果生成时间)privateDate recommendTime;// 创建时间(数据库记录创建时间,默认当前时间)privateDate createTime;// 更新时间(数据库记录更新时间,默认当前时间)privateDate updateTime;// 无参构造器:Spark SQL反射转换必备publicRecommendResult(

Read more

从“多库并存”到“一库多能”:聊聊金仓KingbaseES的融合架构实践

从“多库并存”到“一库多能”:聊聊金仓KingbaseES的融合架构实践

干数据库这行快十年了,亲眼见证了企业数据架构的变迁。早年做项目,最头疼的就是“数据竖井”——交易系统用Oracle,用户行为日志扔到MongoDB,时序监控数据塞进InfluxDB,图谱关系又得搞个Neo4j。每个库都有自己的语法、管理工具和运维体系,开发团队整天在不同数据库之间做数据同步和格式转换,数据一致性难保证,系统复杂度却直线上升。 这几年“融合数据库”的概念越来越热,但很多厂商的理解还停留在“多模接口”层面。直到去年深度参与了某城商行的核心系统分布式改造项目,用金仓数据库KingbaseES 完整跑了一轮,才算真正体会到什么是“一库多能”的设计哲学。今天就跟大家聊聊我们的实践心得,特别是金仓在这方面的独特思考。 一、为什么是“一库多能”,不是“多库拼装”? 先看个真实场景。我们那个银行客户要做实时反欺诈,需要在一个查询里关联:用户账户信息(结构化)、近期交易流水(带时序特征)、设备指纹(JSON文档)、社交关系图谱(判断是否团伙),以及地理位置信息(空间数据)。如果按传统思路,至少要跨5个不同数据库做联合查询,光数据同步延迟就够受的,更别说保证事务一致性了。

By Ne0inhk
Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构

Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 jaspr_serverpod 适配鸿蒙 HarmonyOS 实战:前后端同构,构建全栈式组件渲染与高性能后端集成架构 前言 在鸿蒙(OpenHarmony)生态迈向全栈式开发、涉及跨端组件复用及高性能服务端逻辑集成的背景下,如何实现前端 UI 组件与后端业务逻辑的“无缝类型对齐”,已成为提升全栈研发效率与系统稳定性的关键议题。在鸿蒙设备这类强调分布式架构与端云协同的环境下,如果前端应用(Jaspr)与后端引擎(Serverpod)依然依赖碎片的 REST 协议驱动,由于由于接口契约的离散性,极易由于由于“前后端模型失致”导致线上环境的数据解析崩溃或并发冲突。 我们需要一种能够支持全栈 Dart 编写、具备自动代码生成且支持服务器端渲染(SSR)的同构映射方案。 jaspr_serverpod 为 Flutter/Dart 开发者引入了“全栈闭环”开发模式。

By Ne0inhk
最新Spring Security实战教程(十三)会话管理机制 - 并发控制与会话固定攻击防护

最新Spring Security实战教程(十三)会话管理机制 - 并发控制与会话固定攻击防护

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战 🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解 🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用 ✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧 💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程 🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整 🌞《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术 如果文章能够给大家带来一定的帮助!欢迎关注、评

By Ne0inhk
Rust与Redis数据库开发实战:构建高性能会话管理系统

Rust与Redis数据库开发实战:构建高性能会话管理系统

Rust与Redis数据库开发实战:构建高性能会话管理系统 一、引言 💡Redis是一款高性能的内存数据库,它支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,具有读写速度快、内存占用少、跨平台等特点,非常适合开发缓存、消息队列、会话管理、实时数据分析等应用。 Rust语言以其内存安全、高性能和良好的工具链支持,成为开发Redis应用的理想选择。Rust生态系统中提供了多个优秀的Redis库,其中redis-rs是最成熟、最流行的一个。redis-rs提供了安全、易用的API,支持Redis的全部功能,包括事务处理、管道操作、发布订阅等。 二、开发环境搭建 2.1 安装Redis Redis通常已经预装在大多数操作系统中,你可以通过以下命令检查是否安装: # 检查Redis版本 redis-cli --version 如果没有安装,可以通过以下命令安装: macOS # 使用Homebrew安装 brew install redis # 启动Redis服务 brew services

By Ne0inhk