412 字
1 分钟
Spring AI Alibaba 实战:使用 Redis或JDBC 实现持久化对话记忆
Spring AI Alibaba提供了ChatMemory的抽象,默认实现的Repository(InMemoryChatMemoryRepository)是将会话记忆存储在内存中,应用重启就丢失了
先看最终效果
用户发起请求时,分别带上query和conversationId;向大模型发起请求时,会从Redis中查出所有会话;利用Redis的持久化保证重启也不丢失


第一步:加依赖(不要漏)
<!-- 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。

第三步:手动配置 Redis 仓库(关键)
新建一个 RedisChatMemoryConfig.java:
@Configurationpublic 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 就行(因为我们上面已经把记忆包装进去了)。
@RestControllerpublic 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(); }}第五步:跑起来验证


再到 Redis 里看看:

顺便说说 JDBC 方案(如果你更喜欢数据库)
- 把
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>- 配置数据源:
spring: datasource: url: jdbc:mysql://localhost:3306/chatdb username: root password: 123456 ai: chat: memory: repository: jdbc: initialize-schema: always- 不需要手动写 Repository Bean!Spring AI 会自动配置
JdbcChatMemoryRepository,你只需要像上面一样注入ChatMemoryRepository就能用了。
//减少这一步的代码编写 @Bean public ChatMemoryRepository chatMemoryRepository() { return LettuceRedisChatMemoryRepository.builder() .host(redisHost) .port(redisPort) // 如果有密码就 .password("xxx") .build(); }- 下面是自动创建的表:

总结一下
- Redis 存储:性能好,但需要自己写几行配置代码,而且 starter 不会自动读
spring.data.redis.host。 - JDBC 存储:自动配置完善,完全零代码写 Repository,适合喜欢 SQL 的人。
- 两种方式在业务代码里完全一样,只需要切换依赖和配置类。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Spring AI Alibaba 实战:使用 Redis或JDBC 实现持久化对话记忆
https://cmzh.yongs.xyz/posts/spring-ai-alibaba使用-redis或jdbc-实现持久化对话记忆/ 部分信息可能已经过时
相关文章 智能推荐





