本来想让AI写一下下面步骤的,测试了豆包,deepseek这些都不行,AI写的东西都是瞎写的,,我都无语了,只能直接手动写了,啥也做不了,不得不吐槽
- pom.xml导入依赖
java
<!-- DashScope ChatModel 支持(如果使用其他模型,请跳转 Spring AI 文档选择对应的 starter) -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.1.2.0</version>
</dependency>
<!--spring-ai-alibaba memory-redis-->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
<version>1.1.2.0</version>
</dependency>
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2.yml文件配置
java
spring:
application:
name: spring_ai_001
ai:
dashscope:
api-key: sk-xxxx
base-url: https://dashscope.aliyuncs.com
chat:
options:
model: qwen-plus
data:
redis:
host: localhost
port: 6379
database: 8
timeout: 3000
connect-timeout: 3000
3.配置有两种方式,我们看一下源码,ChatMemoryRepository 下面有几个实现类,我下面配置的是 JedisRedisChatMemoryRepository

4.写一个config配置类
java
package com.hx.springai.config;
import com.alibaba.cloud.ai.memory.redis.JedisRedisChatMemoryRepository;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class ChatRedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Value("${spring.data.redis.database}")
private int database;
// 1. Jedis Redis 仓库(官方提供,就是你要的类
@Bean
public JedisRedisChatMemoryRepository jedisRedisChatMemoryRepository(){
JedisRedisChatMemoryRepository.RedisBuilder builder = JedisRedisChatMemoryRepository.builder();
return builder.host(host)
.port(port)
.database(database)
.build();
}
// 2. 绑定到消息窗口记忆(最多保留 N 条)
@Bean
public ChatMemory chatMemory(JedisRedisChatMemoryRepository repo) {
return MessageWindowChatMemory.builder()
.maxMessages(20) // 可改
.chatMemoryRepository(repo)
.build();
}
}
5.在你自己的model或者client中指定一下 ChatMemory 就可以了
java
@Bean(name = "qwenChatClient")
public ChatClient qwenChatClient(@Qualifier("qwenModel") ChatModel chatModel,
ChatMemory chatMemory) {
return ChatClient.builder(chatModel)
.defaultOptions(OpenAiChatOptions.builder().model(qwen_plus).build())
.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
.build();
}
6.controller层写法
java
package com.hx.springai.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.function.Consumer;
import static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;
/**
* 使用redis保存会话记忆
*/
@RestController
@RequestMapping("/redis")
public class ChatRedisController {
@Resource(name = "qwenChatClient")
private ChatClient qwenChatClient;
@RequestMapping("/chat")
public String chat(String msg,String userId){
String content = qwenChatClient.prompt(msg).advisors(new Consumer<ChatClient.AdvisorSpec>() {
@Override
public void accept(ChatClient.AdvisorSpec advisorSpec) {
advisorSpec.param(CONVERSATION_ID, userId);
}
}).call().content();
return content;
}
@RequestMapping("/chat2")
public String chat2(String msg,String userId){
String content = qwenChatClient.prompt( msg)
.advisors(advisorSpec -> advisorSpec.param(CONVERSATION_ID, userId))
.call()
.content();
return content;
}
}
最后看一下效果,只要多发几次消息,redis里面有这个缓存就行
了
