mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
412 字
1 分钟
Spring AI Alibaba 实战:使用 Redis或JDBC 实现持久化对话记忆
2026-06-06

Spring AI Alibaba提供了ChatMemory的抽象,默认实现的Repository(InMemoryChatMemoryRepository)是将会话记忆存储在内存中,应用重启就丢失了

先看最终效果#

用户发起请求时,分别带上query和conversationId;向大模型发起请求时,会从Redis中查出所有会话;利用Redis的持久化保证重启也不丢失

78075859439

78075866028

第一步:加依赖(不要漏)#

<!-- Spring AI Alibaba 核心包 -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.1.2.0</version>
</dependency>
<!-- Redis 记忆专用 starter(坑就在这里) -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
<version>1.1.2.0</version>
</dependency>

第二步:配置文件(注意,这里埋了坑)#

server:
port: 8080
spring:
ai:
dashscope:
api-key: sk-xxxx # 你的 key,建议通过环境变量的方式加载
data:
redis:
host: 192.168.88.130
port: 6379
database: 0

我一开始以为写了 spring.data.redis.host 就完事了,结果死活连不上本地。后来才发现——Redis 记忆 starter 不会自动读取这个配置,必须手动创建 Repository Bean。

78075884196

第三步:手动配置 Redis 仓库(关键)#

新建一个 RedisChatMemoryConfig.java

@Configuration
public class RedisChatMemoryConfig {
@Value("${spring.data.redis.host}")
private String redisHost;
@Value("${spring.data.redis.port}")
private int redisPort;
// 1. 手动造一个 Redis 仓库
@Bean
public ChatMemoryRepository chatMemoryRepository() {
return LettuceRedisChatMemoryRepository.builder()
.host(redisHost)
.port(redisPort)
// 如果有密码就 .password("xxx")
.build();
}
// 2. 用仓库构造 ChatMemory,设置最多保留10条消息
@Bean
public ChatMemory chatMemory(ChatMemoryRepository repo) {
return MessageWindowChatMemory.builder()
.maxMessages(10)
.chatMemoryRepository(repo)
.build();
}
// 3. 把 ChatMemory 包装成 Advisor
@Bean
public MessageChatMemoryAdvisor advisor(ChatMemory chatMemory) {
return MessageChatMemoryAdvisor.builder(chatMemory).build();
}
// 4. 把 Advisor 挂到 ChatClient 上
@Bean
public ChatClient chatClient(ChatClient.Builder builder,
MessageChatMemoryAdvisor advisor) {
return builder.defaultAdvisors(advisor).build();
}
}

第四步:写个简单的 Controller#

直接注入 ChatClient 就行(因为我们上面已经把记忆包装进去了)。

@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/chat")
public String chat(@RequestParam String message,
@RequestParam String conversationId) {
return chatClient.prompt()
.user(message)
.advisors(a -> a.param("conversationId", conversationId))
.call()
.content();
}
}

第五步:跑起来验证#

78075903191

78075905190

再到 Redis 里看看:

78075913442

顺便说说 JDBC 方案(如果你更喜欢数据库)#

  1. spring-ai-alibaba-starter-memory-redis 换成:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
  1. 配置数据源:
spring:
datasource:
url: jdbc:mysql://localhost:3306/chatdb
username: root
password: 123456
ai:
chat:
memory:
repository:
jdbc:
initialize-schema: always
  1. 不需要手动写 Repository Bean!Spring AI 会自动配置 JdbcChatMemoryRepository,你只需要像上面一样注入 ChatMemoryRepository 就能用了。
//减少这一步的代码编写
@Bean
public ChatMemoryRepository chatMemoryRepository() {
return LettuceRedisChatMemoryRepository.builder()
.host(redisHost)
.port(redisPort)
// 如果有密码就 .password("xxx")
.build();
}
  1. 下面是自动创建的表:

78075929455

总结一下#

  • Redis 存储:性能好,但需要自己写几行配置代码,而且 starter 不会自动读 spring.data.redis.host
  • JDBC 存储:自动配置完善,完全零代码写 Repository,适合喜欢 SQL 的人。
  • 两种方式在业务代码里完全一样,只需要切换依赖和配置类。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Spring AI Alibaba 实战:使用 Redis或JDBC 实现持久化对话记忆
https://cmzh.yongs.xyz/posts/spring-ai-alibaba使用-redis或jdbc-实现持久化对话记忆/
作者
沉眠之海°
发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录