基于大数据的智能推荐系统架构与算法

从零构建基于大数据的智能推荐系统:架构设计与核心算法实践

副标题:以Python+Spark+TensorFlow为例,掌握推荐系统全流程

摘要/引言

打开电商APP时,首页的“猜你喜欢”;刷短视频时,下一条“你可能感兴趣”;听音乐时,播放列表的“每日推荐”——这些我们习以为常的功能,背后都是智能推荐系统在驱动。作为连接用户与信息的“桥梁”,推荐系统已经成为互联网产品的核心竞争力之一。

但对于很多开发者来说,“如何从0到1构建一个能处理海量数据的推荐系统” 仍是一个模糊的问题:

  • 面对TB级的用户行为数据,该用什么架构存储和计算?
  • 协同过滤、矩阵分解、深度学习这些算法,到底该怎么选、怎么实现?
  • 实时推荐的低延迟需求,如何与大数据的批处理能力结合?

本文将给出一个可落地的解决方案:以“Python+Spark+TensorFlow”为核心技术栈,从架构设计算法实现,从离线计算实时推荐,手把手教你构建一个基于大数据的智能推荐系统。

读完本文,你将获得:

  1. 一套完整的推荐系统架构设计思路(数据层→计算层→服务层);
  2. 核心推荐算法(协同过滤、Wide&Deep、实时召回)的代码实现;
  3. 大数据场景下的性能优化技巧(Spark分区、模型并行、缓存策略);
  4. 解决冷启动、数据稀疏等常见问题的实践经验。

目标读者与前置知识

目标读者

  • 有Python基础,想学习推荐系统的初级数据工程师/后端开发者
  • 了解大数据基本概念(Hadoop/Spark),但未实际应用于推荐场景的技术爱好者
  • 想从0到1搭建推荐系统的产品技术负责人

前置知识

  1. 基础编程:Python语法、SQL查询;
  2. 大数据基础:了解Hadoop分布式存储、Spark批处理/流处理;
  3. 机器学习基础:知道线性模型、神经网络的基本概念(非必须,但能加快理解)。

文章目录

  1. 引言与基础
  2. 推荐系统的核心问题与挑战
  3. 基于大数据的推荐系统架构设计
  4. 核心算法:从协同过滤到深度学习
  5. 分步实现:构建你的第一个推荐系统
  6. 性能优化与最佳实践
  7. 常见问题与解决方案
  8. 未来展望
  9. 总结

一、推荐系统的核心问题与挑战

在开始架构设计前,我们需要先明确推荐系统的本质

推荐系统是“用户兴趣”与“物品特征”的匹配引擎,其目标是在合适的时间、合适的场景,给合适的用户推荐合适的物品。

1.1 推荐系统的核心问题

  • 数据稀疏性:用户只接触过极少数物品(比如100万件商品中,用户只点击过10件);
  • 冷启动:新用户/新物品没有历史数据,无法生成推荐;
  • 实时性:用户的兴趣会随时间变化(比如刚搜索过“登山鞋”,希望立刻看到相关推荐);
  • ** scalability(扩展性)**:面对亿级用户/物品,传统单机算法无法处理。

1.2 为什么需要结合大数据?

传统推荐系统(比如基于MySQL的协同过滤)的局限性:

  • 存储:无法处理TB级的用户行为数据;
  • 计算:单机训练模型需要数天甚至更久;
  • 实时:无法实时处理用户的最新行为。

而大数据技术(Hadoop/Spark/Flink)正好解决这些问题:

  • 分布式存储:HDFS/Hive可存储PB级数据;
  • 分布式计算:Spark可并行处理海量数据,训练模型时间从“天”缩短到“小时”;
  • 流处理:Flink/Spark Streaming可实时处理用户行为,实现低延迟推荐。

二、基于大数据的推荐系统架构设计

一个完整的推荐系统架构分为三层:数据层计算层服务层。每层的核心职责与技术栈如下:

2.1 架构全景图

用户行为采集

数据层:存储与预处理

计算层:离线计算+实时计算

服务层:推荐接口+AB测试

用户端:APP/WEB

2.2 各层详细设计

2.2.1 数据层:存储与预处理

核心职责:收集、存储用户行为数据,并转换成算法可直接使用的格式。

  • 数据来源
    • 用户行为数据(点击、购买、收藏、评分);
    • 用户属性数据(年龄、性别、地域);
    • 物品属性数据(商品类别、电影类型、音乐风格)。
  • 技术选型
    • 实时采集:Fluentd/Kafka(收集用户行为日志);
    • 离线存储:HDFS/Hive(存储历史数据);
    • 实时存储:Redis(存储用户实时兴趣向量);
    • 预处理:Spark SQL(清洗、过滤、特征工程)。

示例:用户行为数据预处理
假设我们有一份用户点击日志(user_behavior.csv),字段包括user_iditem_idactiontimestamp。用Spark SQL清洗数据:

from pyspark.sql import SparkSession from pyspark.sql.functions import col, from_unixtime, date_format # 初始化SparkSession spark = SparkSession.builder.appName("DataPreprocessing").getOrCreate()# 读取原始数据(HDFS路径) raw_data = spark.read.csv("hdfs://cluster:9000/data/user_behavior.csv", header=True, inferSchema=True)# 1. 过滤无效数据(用户ID/物品ID为空、时间戳非法) cleaned_data = raw_data.filter( col("user_id").isNotNull()& col("item_id").isNotNull()&(col("timestamp")>0))# 2. 时间特征工程(提取日期、小时) processed_data = cleaned_data.withColumn("date", date_format(from_unixtime(col("timestamp")),"yyyy-MM-dd")).withColumn("hour", date_format(from_unixtime(col("timestamp")),"HH"))# 3. 保存到Hive表(供后续计算使用) processed_data.write.mode("overwrite").saveAsTable("recommendation.user_behavior")
2.2.2 计算层:离线计算+实时计算

核心职责:基于预处理后的数据,训练推荐模型,生成推荐结果。

计算层分为离线计算(处理历史数据,生成长期推荐)和实时计算(处理最新行为,生成短期推荐)两部分:

类型目标算法技术栈
离线计算生成用户长期兴趣推荐协同过滤、矩阵分解、Wide&DeepSpark MLlib、TensorFlow
实时计算生成用户短期兴趣推荐实时召回、兴趣更新Spark Streaming、Flink
  • 离线计算流程
    1. 从Hive读取用户-物品交互数据;
    2. 训练推荐模型(比如ALS矩阵分解);
    3. 生成用户推荐列表(比如给每个用户推荐Top100物品);
    4. 保存推荐结果到HBase/Redis。
  • 实时计算流程
    1. 从Kafka读取用户最新行为(比如点击了物品A);
    2. 实时更新用户兴趣向量(比如用物品A的嵌入向量调整用户向量);
    3. 实时召回与用户兴趣匹配的物品;
    4. 将实时推荐结果返回给服务层。
2.2.3 服务层:推荐接口+AB测试

核心职责:将计算层生成的推荐结果对外提供服务,并通过AB测试优化推荐效果。

  • 技术选型
    • 推荐接口:FastAPI/Flask(提供RESTful API);
    • AB测试:Redis(存储实验分组)、Prometheus(监控指标);
    • 缓存:Redis(存储热门推荐、用户推荐列表,降低延迟)。

示例:推荐接口实现
用FastAPI写一个推荐接口,返回用户的Top10推荐物品:

from fastapi import FastAPI import redis import json app = FastAPI() r = redis.Redis(host="redis", port=6379, db=0)@app.get("/recommend/{user_id}")defget_recommendation(user_id:int):# 从Redis读取用户推荐列表(离线计算的结果) recommend_list = r.get(f"user:{user_id}:recommend")if recommend_list:return json.loads(recommend_list)else:# 冷启动:返回热门物品 hot_items = r.get("hot_items")return json.loads(hot_items)if hot_items else[]

三、核心算法:从协同过滤到深度学习

推荐系统的算法可以分为召回排序两大阶段:

  • 召回:从百万级物品中快速筛选出数百个与用户兴趣匹配的物品(强调速度);
  • 排序:对召回的物品进行精确排序(强调准确性)。

3.1 召回算法:快速缩小范围

召回的核心是“高效匹配”,常见算法包括:

3.1.1 基于用户的协同过滤(User-Based CF)

思想:找到与当前用户兴趣相似的用户,推荐这些用户喜欢的物品。
公式:用户u对物品i的评分预测 = 相似用户对i的评分加权平均。

示例:用Spark MLlib实现User-Based CF

from pyspark.ml.recommendation import ALS from pyspark.ml.evaluation import RegressionEvaluator # 读取用户-物品评分数据(user_id, item_id, rating) ratings = spark.read.table("recommendation.user_item_ratings")# 初始化ALS模型(User-Based CF) als = ALS( userCol="user_id", itemCol="item_id", ratingCol="rating", rank=10,# 隐因子数量(复杂度) regParam=0.01,# 正则化参数(防止过拟合) coldStartStrategy="drop"# 处理冷启动:删除无历史数据的用户/物品)# 训练模型 model = als.fit(ratings)# 生成用户推荐列表(给每个用户推荐Top10物品) user_recs = model.recommendForAllUsers(10) user_recs.show(5)
3.1.2 基于物品的协同过滤(Item-Based CF)

思想:找到与当前物品相似的物品,推荐给喜欢当前物品的用户。
适用场景:物品数量小于用户数量的场景(比如电商)。

3.1.3 实时召回:基于用户最新行为

思想:用户刚点击了物品A,立刻推荐与A相似的物品。
实现:用Redis存储物品的相似列表(离线计算),当用户点击A时,直接返回A的相似物品。

3.2 排序算法:精确匹配兴趣

排序的核心是“精准预测”,常见算法包括:

3.2.1 逻辑回归(Logistic Regression)

思想:将用户特征、物品特征、上下文特征拼接成向量,用逻辑回归预测用户点击概率。
优点:简单、可解释性强;
缺点:无法捕捉特征间的非线性关系。

3.2.2 Wide&Deep模型(Wide & Deep Learning)

思想:结合“Wide线性模型”(记忆高频特征组合)和“Deep神经网络”(泛化低频特征),兼顾“记忆”与“泛化”。
架构图

用户ID

Embedding

物品ID

用户年龄

Wide

物品类别

Deep

Concatenate

点击概率

示例:用TensorFlow实现Wide&Deep

import tensorflow as tf from tensorflow.keras.layers import Input, Dense, Embedding, Flatten, Concatenate from tensorflow.keras.models import Model # 1. 定义输入特征 user_id = Input(shape=(1,), name="user_id")# 用户ID(离散特征) item_id = Input(shape=(1,), name="item_id")# 物品ID(离散特征) user_age = Input(shape=(1,), name="user_age")# 用户年龄(连续特征) item_category = Input(shape=(1,), name="item_category")# 物品类别(离散特征)# 2. Wide部分:线性模型(处理高频特征组合) wide_features = Concatenate()([user_age, item_category]) wide_output = Dense(1, activation="relu")(wide_features)# 3. Deep部分:神经网络(处理低频特征泛化)# 离散特征嵌入(将高维ID转换成低维向量) user_emb = Embedding(input_dim=100000, output_dim=32)(user_id)# 用户ID嵌入(10万用户→32维) item_emb = Embedding(input_dim=1000000, output_dim=64)(item_id)# 物品ID嵌入(100万物品→64维)# 拼接嵌入向量并 flatten deep_features = Concatenate()([Flatten()(user_emb), Flatten()(item_emb)])# 全连接层 deep_features = Dense(128, activation="relu")(deep_features) deep_features = Dense(64, activation="relu")(deep_features) deep_output = Dense(1, activation="relu")(deep_features)# 4. 合并Wide和Deep输出 final_output = Concatenate()([wide_output, deep_output]) final_output = Dense(1, activation="sigmoid")(final_output)# 输出点击概率(0~1)# 5. 构建并编译模型 model = Model(inputs=[user_id, item_id, user_age, item_category], outputs=final_output) model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss=tf.keras.losses.BinaryCrossentropy(),# 二分类损失(点击/未点击) metrics=[tf.keras.metrics.AUC(name="auc")]# 评估指标(AUC:曲线下面积))# 打印模型结构 model.summary()

训练与评估
假设我们有训练数据train_data(包含用户ID、物品ID、年龄、类别、点击标签),可以用model.fit()训练:

# 训练模型(用GPU加速) history = model.fit( x=train_data[["user_id","item_id","user_age","item_category"]], y=train_data["click"], batch_size=256, epochs=10, validation_split=0.2)# 评估模型(AUC越高,预测效果越好) val_auc = model.evaluate(val_data, verbose=0)[1]print(f"Validation AUC: {val_auc:.4f}")
3.2.3 深度学习进阶:Neural Collaborative Filtering(NCF)

思想:用神经网络代替传统的矩阵分解,更好地捕捉用户与物品的交互关系。
适用场景:需要高精度排序的场景(比如短视频推荐)。

四、分步实现:构建你的第一个推荐系统

现在,我们用MovieLens 1M数据集(包含100万条用户电影评分),一步步实现一个电影推荐系统。

4.1 环境准备

4.1.1 工具列表
  • 大数据框架:Hadoop 3.3.4、Spark 3.4.1;
  • 深度学习框架:TensorFlow 2.13.0;
  • 存储:Hive 3.1.3、Redis 7.2.0;
  • 接口:FastAPI 0.100.0。
4.1.2 配置文件

requirements.txt

pyspark==3.4.1 tensorflow==2.13.0 fastapi==0.100.0 uvicorn==0.23.2 redis==4.6.0 pandas==2.1.0 

Dockerfile(一键部署环境):

FROM python:3.10-slim # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 暴露端口(FastAPI) EXPOSE 8000 # 启动服务 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] 

4.2 步骤1:数据预处理

  1. 下载MovieLens 1M数据集:https://grouplens.org/datasets/movielens/1m/
  2. 上传到HDFS:hadoop fs -put ml-1m /data
  3. 用Spark SQL清洗数据(参考2.2.1节的代码),生成user_behavior表。

4.3 步骤2:离线计算(ALS矩阵分解)

  1. 读取user_behavior表中的评分数据;
  2. 训练ALS模型(参考3.1.1节的代码);

生成用户推荐列表,保存到Redis:

# 将用户推荐列表转换为JSON格式,保存到Redisfor row in user_recs.collect(): user_id = row["user_id"] recs =[r["item_id"]for r in row["recommendations"]] r.set(f"user:{user_id}:recommend", json.dumps(recs))

4.4 步骤3:实时计算(Spark Streaming)

  1. 启动Kafka,创建movie_behavior_stream主题;
  2. 用Spark Streaming读取Kafka中的实时行为数据(比如用户点击了电影);

实时更新用户兴趣向量:

from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils import json # 初始化StreamingContext(每5秒处理一批数据) ssc = StreamingContext(spark.sparkContext,5)# 从Kafka读取实时数据 kafka_params ={"metadata.broker.list":"kafka:9092"} stream = KafkaUtils.createDirectStream(ssc,["movie_behavior_stream"], kafka_params)# 解析JSON数据 parsed_stream = stream.map(lambda x: json.loads(x[1]))# 实时更新用户兴趣向量(用物品嵌入的指数移动平均)defupdate_user_emb(user_id, events, current_emb):if current_emb isNone: current_emb =[0.0]*32# 初始化为32维零向量# 假设item_emb_dict是预存的电影嵌入(从ALS模型中获取)for event in events: item_id = event["item_id"]if item_id in item_emb_dict:# 指数移动平均:最新行为占20%权重 current_emb =[0.8*old +0.2*new for old, new inzip(current_emb, item_emb_dict[item_id])]return current_emb user_emb_stream = parsed_stream.map(lambda x:(x["user_id"], x)).updateStateByKey(update_user_emb)# 保存用户兴趣向量到Redis user_emb_stream.foreachRDD(lambda rdd: rdd.foreachPartition(save_to_redis))# 启动StreamingContext ssc.start() ssc.awaitTermination()

4.5 步骤4:服务层实现

用FastAPI写推荐接口(参考2.2.3节的代码),启动服务:

uvicorn main:app --reload 

测试接口:访问http://localhost:8000/recommend/123,返回用户123的Top10推荐电影。

五、性能优化与最佳实践

5.1 Spark性能优化

  • 数据分区:根据用户ID或物品ID分区,减少shuffle(比如repartition(100));
  • 缓存数据:用cache()缓存常用的DataFrame,避免重复计算;
  • 调整资源:增加Executor内存(--executor-memory 8g)、增加核心数(--executor-cores 4)。

5.2 模型训练优化

  • 分布式训练:用TensorFlow的MirroredStrategy做多GPU训练,加速模型收敛;
  • 批量处理:增大batch_size(比如从128到512),提高GPU利用率;
  • 早停策略:用EarlyStopping监控验证集指标,避免过拟合。

5.3 服务层优化

  • 缓存热门数据:将热门电影的推荐列表存到Redis,减少数据库查询;
  • 异步推荐:用Celery异步生成推荐列表,避免接口阻塞;
  • CDN加速:将静态资源(比如电影海报)存到CDN,降低延迟。

六、常见问题与解决方案

6.1 冷启动问题

  • 新用户:推荐热门电影(根据全局评分排序);
  • 新电影:根据电影类别推荐给喜欢该类别的用户(内容推荐);
  • 解决方案:结合用户注册时的兴趣标签(比如“喜欢科幻片”)生成初始推荐。

6.2 数据稀疏问题

  • 解决方案
    1. 加入上下文特征(比如时间、地点);
    2. 用矩阵分解(ALS)填充缺失值;
    3. 用深度学习模型(Wide&Deep)捕捉隐性特征。

6.3 实时推荐延迟问题

  • 解决方案
    1. 用Flink代替Spark Streaming(Flink的延迟更低,支持事件时间);
    2. 减少流处理的批次大小(比如从5秒到1秒);
    3. 用Redis的Pipeline批量操作,减少网络开销。

七、未来展望

推荐系统的未来发展方向:

  1. 结合大语言模型(LLM):用LLM生成用户的兴趣描述(比如“喜欢科幻、悬疑、低成本电影”),然后匹配物品;
  2. 强化学习推荐:根据用户的反馈(点击/跳过)实时调整推荐策略,最大化长期收益;
  3. 跨模态推荐:结合文本、图像、音频特征(比如根据用户的图片浏览历史推荐相关视频);
  4. 隐私保护推荐:用联邦学习(Federated Learning)在不泄露用户隐私的情况下训练模型。

八、总结

本文从架构设计算法实现,手把手教你构建了一个基于大数据的智能推荐系统。核心要点总结如下:

  1. 推荐系统的架构分为数据层(存储与预处理)、计算层(离线+实时计算)、服务层(接口+AB测试);
  2. 召回算法强调速度(协同过滤、实时召回),排序算法强调准确性(Wide&Deep、NCF);
  3. 大数据技术(Spark、Hadoop)解决了传统推荐系统的** scalability实时性**问题;
  4. 常见问题(冷启动、数据稀疏)可以通过内容推荐矩阵分解深度学习解决。

推荐系统是一个“实践出真知”的领域,只有不断尝试、优化,才能做出真正符合用户需求的推荐。希望本文能成为你进入推荐系统领域的“入门钥匙”,祝你在推荐系统的路上越走越远!

参考资料

  1. Spark MLlib官方文档:https://spark.apache.org/mllib/
  2. TensorFlow推荐系统库:https://www.tensorflow.org/recommenders
  3. 经典论文:
    • Collaborative Filtering for Implicit Feedback Datasets(ALS算法)
    • Wide & Deep Learning for Recommender Systems(Wide&Deep模型)
    • Neural Collaborative Filtering(NCF模型)
  4. 书籍:《推荐系统实践》(项亮)、《大数据技术原理与应用》(林子雨)
  5. 数据集:MovieLens 1M(https://grouplens.org/datasets/movielens/1m/)

附录

  1. 完整代码仓库:https://github.com/yourname/movie-recommendation-system
  2. 性能测试报告:https://github.com/yourname/movie-recommendation-system/blob/main/performance_report.md
  3. 模型文件:https://drive.google.com/drive/folders/yourmodel(包含ALS模型、Wide&Deep模型)

最后:如果本文对你有帮助,欢迎点赞、收藏、转发!有任何问题,欢迎在评论区留言,我会尽力解答~

Read more

X86、ARM与C86架构全面对比分析:性能、功耗、成本与生态系统

目录标题 * X86、ARM与C86架构全面对比分析:性能、功耗、成本与生态系统 * 一、架构概述与发展背景 * 1.1 X86架构:PC与服务器市场的传统霸主 * 1.2 ARM架构:移动领域的王者与新兴服务器力量 * 1.3 C86架构:国产x86兼容的创新尝试 * 二、性能表现对比分析 * 2.1 运算速度与数据处理能力 * 2.2 不同场景下的性能表现 * 2.3 性能优化与未来趋势 * 三、功耗与能效比分析 * 3.1 不同架构的功耗特性 * 3.2 不同应用场景下的能耗分析 * 3.3 能效优化技术与未来趋势 * 四、成本分析与经济性比较 * 4.1 芯片制造成本对比 * 4.2 不同应用场景的总体拥有成本(

By Ne0inhk
从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

从SQL Server到KingbaseES:一步到位的跨平台迁移与性能优化指南

摘要:信创背景下,国产数据库正以惊人的兼容性和更优的成本效益赢得市场。本文详细介绍了国产数据库KingbaseES V9R4C12作为SQL Server替代方案的实战应用。通过代码示例展示了其在语法兼容性(95%以上T-SQL兼容)、数据类型支持、存储过程迁移等方面的优异表现。文章包含Windows/Linux安装指南、基础操作对比、高级特性实现(如分页查询、事务控制)以及TPCH100G性能测试结果(部分场景性能优于SQL Server)。特别强调了KingbaseES在信创背景下的合规优势,提供了迁移验证脚本和注意事项,证明其能实现低风险平滑迁移,同时大幅降低License成本。 一、为什么选择KingbaseES替代SQL Server? 在信创窗口期,许多使用SQL Server作为核心数据库的企业面临着合规性风险和高昂的License费用。经过多轮PoC验证, 金仓KingbaseES V9R4C12(SQL Server兼容版) 展现出强大的兼容能力,官方宣称"数据库平替用金仓",为背负2000+存储过程的系统提供了低风险迁移方案。 先来看一个直观的兼容性对比:

By Ne0inhk
数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

在数字化转型持续深化的今天,数据早已从辅助资源升级为企业的核心生产要素。无论是政务系统、金融交易,还是工业控制、能源调度,数据库作为数据的最终载体,其安全直接关系到业务连续性与数据资产完整性。 在各类数据库安全威胁中,SQL注入凭借门槛低、隐蔽性强、破坏力大的特点,长期位居OWASP Top 10 Web应用安全风险前列。它就像潜伏在业务链路中的隐秘入侵者,利用应用逻辑漏洞,将恶意指令伪装成正常参数传入数据库,进而实现越权访问、数据窃取甚至删库破坏。 尽管行业内早已形成共识——通过预编译语句、参数化查询、输入校验等方式可以有效防范SQL注入,但在真实业务环境中,风险依然无处不在:老旧系统的遗留代码难以全面改造、第三方组件存在未知漏洞、多团队协作中难免出现编码疏漏、动态SQL拼接场景难以完全规范化……只要存在一处薄弱环节,就可能被攻击者利用,引发连锁安全事故。 面对这种“处处设防仍可能百密一疏”的困境,单纯依赖应用层加固显然不够。能否从数据库自身出发,构建一层独立、可靠、主动的防御体系?金仓数据库(KingbaseES)V009R002C014版本内置的SQL防火墙能力,正是从这一

By Ne0inhk
【Spring Boot】解锁高效安全之门:登录令牌技术的实战应用与价值解析

【Spring Boot】解锁高效安全之门:登录令牌技术的实战应用与价值解析

前言 🌟🌟本期讲解关于token令牌技术介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客 🔥 你的点赞就是小编不断更新的最大动力                                        🎆那么废话不多说直接开整吧~~  目录 📚️1.Session与Cookie 🚀1.1实现原理 🚀1.2集群环境情况 📚️2.令牌技术 🚀2.1实现校验原理 🚀2.2优缺点 🚀2.3JWT令牌 2.3.1JWT组成 2.3.2JWT令牌⽣成和校验 2.3.3生成令牌  2.3.4密钥的生成 2.3.5令牌的解析 📚️3.令牌技术的使用 🚀3.1令牌技术功能类 🚀3.2controller层 📚️4.总结   📚️1.Session与Cookie 🚀1.1实现原理 传统情况下:

By Ne0inhk