Spring AI 实战(3):Alibaba 三行配置搞定 MySQL+Redis 记忆存储
这是《Spring AI 实战》系列第 3 篇。第 1 篇讲了为什么用 Spring AI、Portable API 怎么屏蔽模型差异第 2 篇落地了「能聊天、有性格、记得住」的三件套ChatClient Prompt ChatMemory。这一篇解决三件套里最容易被忽略、却最要命的一环ChatMemory 怎么从「demo 玩具」变成「生产级持久化」。开局InMemoryChatMemory 能玩不能上线第 2 篇里我们用的记忆是内存版最小写法就一行BeanpublicChatMemorychatMemory(){returnnewInMemoryChatMemory();}它能跑通多轮对话但有三个致命伤任何一个都足以让你在生产环境翻车重启即丢进程一重启所有对话记忆清零用户第二天来聊AI 完全不认识他。内存无限堆积InMemoryChatMemory不淘汰、不落盘会话越多内存越涨最终 OOM。多实例不同步加了节点做负载均衡A 实例记的对话 B 实例不知道用户请求在实例间漂移记忆时有时无。金鱼脑的聊天机器人上线即事故。要解决这个问题核心动作只有两步引依赖 写 yml。下面两套方案都来自 Spring AI Alibaba 官方扩展代码量趋近于零。方案一MySQLAlibaba JDBC Starter适合团队已经有 MySQL的场景零额外基础设施。第一步引依赖dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-memory-jdbc/artifactIdversion1.0.0.3/version/dependency第二步写配置spring:ai:chat:memory:repository:jdbc:mysql:jdbc-url:jdbc:mysql://localhost:3306/memory_db?useSSLfalseserverTimezoneAsia/Shanghaiusername:rootpassword:${MYSQL_PASSWORD}driver-class-name:com.mysql.cj.jdbc.Driverenabled:true# 默认 false必须显式打开enabled一开框架在MysqlChatMemoryRepository初始化时自动检查表是否存在——不存在就给你建好。DDL、索引、字段设计全包了你连建表 SQL 都不用写。如果你的数据库是 PostgreSQL、Oracle、SQL Server把mysql换成postgres、oracle、sqlserver即可配置结构完全一致。第三步写代码ChatConfig—— 全局缓存和 Advisor一次构建ConfigurationpublicclassChatConfig{BeanpublicMessageWindowChatMemorychatMemory(MysqlChatMemoryRepositoryrepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(repository).maxMessages(50).build();}BeanpublicChatClientchatClient(ChatClient.Builderbuilder,MessageWindowChatMemorychatMemory){returnbuilder.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}}ChatController—— 每次请求只传对话 IDRestControllerpublicclassChatController{privatefinalChatClientchatClient;publicChatController(ChatClientchatClient){this.chatClientchatClient;}GetMapping(/chat)publicStringchat(RequestParamStringprompt,RequestParamStringconversationId){returnchatClient.prompt(prompt).advisors(a-a.param(MessageChatMemoryAdvisor.CONVERSATION_ID,conversationId)).call().content();}}conversationId区分不同用户/会话每人一段独立的记忆空间。ChatClient 和 Advisor 启动时建好请求链路零开销。方案二RedisAlibaba Redis Starter适合团队已经有 Redis、且要更高读写性能的场景。第一步引依赖Redis 需要两个包——自动装配 实现dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-autoconfigure-memory/artifactIdversion1.0.0.3/version/dependencydependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-memory-redis/artifactIdversion1.0.0.3/version/dependency第二步写配置单机最简spring:ai:memory:redis:mode:standalonehost:localhostport:6379password:${REDIS_PASSWORD}想换客户端一行client-type:jedis# 默认 lettuce可选 jedis / redisson集群模式spring:ai:memory:redis:mode:clustercluster:nodes:10.0.0.1:6379,10.0.0.2:6379,10.0.0.3:6379第三步写代码ChatConfig—— 和 MySQL 方案只差一个注入的 Repository 类型ConfigurationpublicclassChatConfig{BeanpublicMessageWindowChatMemorychatMemory(BaseRedisChatMemoryRepositoryrepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(repository).maxMessages(50).build();}BeanpublicChatClientchatClient(ChatClient.Builderbuilder,MessageWindowChatMemorychatMemory){returnbuilder.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();}}ChatController —— 和 MySQL 方案完全一样一行不动RestControllerpublicclassChatController{privatefinalChatClientchatClient;publicChatController(ChatClientchatClient){this.chatClientchatClient;}GetMapping(/chat)publicStringchat(RequestParamStringprompt,RequestParamStringconversationId){returnchatClient.prompt(prompt).advisors(a-a.param(MessageChatMemoryAdvisor.CONVERSATION_ID,conversationId)).call().content();}}从 MySQL 切到 Redis改动的代码只有一行—— 把MysqlChatMemoryRepository换成BaseRedisChatMemoryRepository。Controller 零改动业务逻辑零改动。这就是抽象层带来的红利。为什么要避开手写方案如果纯手写你需要实现ChatMemoryStore接口写 60 行、Jackson 多态序列化配置、定时清理任务、建表 SQL。两个存储方案加起来小 200 行。Alibaba 方案呢两段配置 两段 Config 不到 30 行。而且多出来的不光是代码量维度手写Alibaba JDBCAlibaba Redis建表手动 SQL自动建不需要序列化Jackson 多态配置框架内置框架内置过期清理手写定时任务框架内置框架内置 TTL多客户端无-Lettuce/Jedis/Redisson 切着玩集群手写共享库就行配置写几个 IP切存储改代码量重写改一行改一行选 MySQL 还是 Redis维度MySQLRedis额外运维零已有 MySQL需要 Redis性能毫秒级够用微秒级多实例共享MySQL 即可天然支持依赖量1 个包2 个包一句话团队已经有 Redis 就上 Redis没有就用 MySQL。聊天记忆不值得你专门引入一套 Redis 基础设施。几个容易踩的点enabled: true必须显式打开JDBC 和 Redis 的 Starter 默认enabledfalse不写这一行框架不会初始化 Repository启动不报错但记忆根本没持久化——排查起来很隐蔽。配置项是jdbc-url不是url和 Spring 传统的spring.datasource.url命名不同照抄老习惯会连不上库。client-type别乱填Redis 默认lettuce可选jedis/redisson填了不存在的值启动直接失败。maxMessages要设不设这个窗口记忆照样无限增长虽然落盘了但单会话消息越来越多token 成本和控制台都吃不消。conversationId必须每次传忘了传所有用户共享同一段记忆聊天内容串台。小结Spring AI Alibaba 把记忆持久化做成了「引依赖 写 yml」的体力活把常用存储封成 Starter、把记忆做成可配置的 Bean、让存储切换不影响业务代码。你不需要关心 JSON 序列化、表结构、过期策略、客户端的底层差异——闭着眼睛配 yml写两段 Config聊天机器人就带上生产级持久化记忆了。如果这篇对你有帮助点个关注 我会持续更新 Spring AI 实战系列从聊天、RAG 到原理篇篇带完整代码关注不迷路。博主10 年 Java 全栈开发优质创作者。专注 Spring 源码、架构设计与 Spring AI 实战。前文回顾Spring AI 实战1Java 开发者如何优雅接入大模型附完整代码Spring AI 实战2ChatClientPrompt记忆三件套手把手搭 AI 对话附代码

相关新闻

高中物理成绩优异,适合报考大数据哪个细分专业?

高中物理成绩优异,适合报考大数据哪个细分专业?

这个问题挺有意思的。物理成绩好,说明你的逻辑思维、数学建模能力都不错。那在大数据相关的专业里,哪个最能把你的物理优势发挥出来?物理好的人,优势在哪?物理好的同学,通常具备三个特点:数学底…

2026/7/17 6:30:32阅读更多 →
[python] 我用脚本实现了一个F1 F2代替ctrl+c复制 ctrl+v粘贴的软件 【Clipboard Tool】

[python] 我用脚本实现了一个F1 F2代替ctrl+c复制 ctrl+v粘贴的软件 【Clipboard Tool】

Clipboard Tool 的奇思妙想 1. 概述 发现自己在工作时,经常会用到Ctrl C Ctrl V,还有企业微信的AltShiftAl来截图,我想使用python 热键脚本实现代替 所以我想能用到F1代替复制 F2代替粘贴 F3代替企业微信的截图 那就完美了。 手指只需要放在这三个键上就…

2026/7/17 6:30:32阅读更多 →
JAVA白皮书

JAVA白皮书

这个世界不会是强者恒强,后来者总能居上,只要我们在路上,就总会赢 一、打包篇 在 Spring Boot 项目中,将 resource/lib 目录下的 JAR 包引入 pom.xml <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-clickhouse<…

2026/7/17 6:30:32阅读更多 →
Unity Addressable资源管理框架:从核心概念到工程实践

Unity Addressable资源管理框架:从核心概念到工程实践

1. 项目概述&#xff1a;为什么我们需要Addressable系统&#xff1f;如果你在Unity项目里做过资源管理&#xff0c;大概率经历过这样的场景&#xff1a;项目初期&#xff0c;所有资源都放在Resources文件夹里&#xff0c;加载用Resources.Load&#xff0c;感觉挺方便。但随着项…

2026/7/17 7:35:36阅读更多 →
惠普游戏本系统安装与优化全指南

惠普游戏本系统安装与优化全指南

1. 惠普暗影精灵与光影精灵系列电脑系统安装前的准备工作在开始安装系统前&#xff0c;我们需要做好充分的准备工作。首先需要明确的是&#xff0c;惠普暗影精灵&#xff08;OMEN&#xff09;和光影精灵&#xff08;VICTUS&#xff09;系列虽然都是游戏本&#xff0c;但在硬件配…

2026/7/17 7:35:36阅读更多 →
Windows SYSTEM账户权限管理与安全实践

Windows SYSTEM账户权限管理与安全实践

1. SYSTEM账户的本质与权限层级Windows系统中的SYSTEM账户&#xff08;NT AUTHORITY\SYSTEM&#xff09;是操作系统内核使用的最高权限账户&#xff0c;其权限级别甚至超过Administrator。这个账户默认不显示在用户管理界面中&#xff0c;也不提供交互式登录功能&#xff0c;主…

2026/7/17 7:35:36阅读更多 →
基于OpenHarmony的多模态智能门锁系统设计与实现

基于OpenHarmony的多模态智能门锁系统设计与实现

1. 项目背景与核心需求智能门锁作为传统机械锁的升级方案&#xff0c;近年来在安全性、便捷性和智能化方面持续演进。当前主流智能门锁普遍采用指纹、密码或NFC等单一认证方式&#xff0c;存在生物特征识别率不稳定、备用开锁方案体验割裂等问题。本项目基于小凌派RK2206开发板…

2026/7/17 7:35:36阅读更多 →
Windows与Linux双系统引导管理实战指南

Windows与Linux双系统引导管理实战指南

1. 双系统引导管理概述在Windows环境下管理双系统启动项是许多开发者和技术爱好者的刚需。当我们在同一台机器上安装Windows和Linux双系统时&#xff0c;通常会遇到启动菜单缺失Linux选项的情况。这并非系统安装失败&#xff0c;而是Windows的引导管理器&#xff08;Boot Manag…

2026/7/17 7:35:36阅读更多 →
DownKyi项目法律合规性分析:开源视频下载工具的法律边界与用户指南

DownKyi项目法律合规性分析:开源视频下载工具的法律边界与用户指南

DownKyi项目法律合规性分析&#xff1a;开源视频下载工具的法律边界与用户指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去…

2026/7/17 7:30:36阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比&#xff1a;全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时&#xff0c;第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/16 8:28:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件&#xff1a;5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/16 6:53:04阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL&#xff1a;跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器&#xff0c;VS Code 的默认配置已经能满足基本需求&#xff0c;但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间&#xff0c;期间尝试过各种配置方案&#xff0c;总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包&#xff0c;解压时系统自带的工具弹出一串乱码&#xff0c;换用 WinRAR 却顺利打开了。这种看似简单的场景&#xff0c;恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具&#xff0c;真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →