使用redis+springboot+langchain4j实现AI对话持久化

1.添加redis依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置配置文件.yml

复制代码
spring:
  data:
    redis:
      # Redis 服务器地址
      host: localhost
      # Redis 服务器端口
      port: 6379
      # 如果你设置了密码,填在这里(默认通常没有密码,可留空)
      # spring.data.redis.password=123456
      # 数据库索引(默认为0)
      database: 0

3.启动redis,编写RedisChatMemoryStore类,实现了ChatMemoryStore接口:

复制代码
@Component
public class RedisChatMemoryStore implements ChatMemoryStore {

    private final StringRedisTemplate redisTemplate;

    // 定义一个 Key 前缀,防止和其他 Redis 数据冲突
    private static final String KEY_PREFIX = "chat:memory:";
    // 定义数据过期时间,例如 7 天后自动删除闲置的聊天记录
    private static final Duration TTL = Duration.ofDays(7);

    public RedisChatMemoryStore(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        // 1. 拼接 Key
        String key = KEY_PREFIX + memoryId;

        // 2. 从 Redis 获取 JSON 字符串
        String json = redisTemplate.opsForValue().get(key);

        // 3. 如果为空,返回空列表;否则反序列化
        if (json == null || json.isEmpty()) {
            return new ArrayList<>();
        }
        return messagesFromJson(json);
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        String key = KEY_PREFIX + memoryId;
        String json = messagesToJson(messages);

        // 4. 保存到 Redis,并设置过期时间
        // set(key, value, timeout)
        redisTemplate.opsForValue().set(key, json, TTL);
    }

    @Override
    public void deleteMessages(Object memoryId) {
        String key = KEY_PREFIX + memoryId;
        redisTemplate.delete(key);
    }
}

4.工厂类中在创建ChatMemory时添加上ChatMemoryStore属性:

复制代码
@Bean
public AiCodeHelperService aiCodeHelperService(){
  ChatMemory chatMemory=MessageWindowChatMemory.builder()
          .chatMemoryStore(redisChatMemoryStore)
          .id("rance-global")
          .maxMessages(10)
          .build();

  AiCodeHelperService build = AiServices.builder(AiCodeHelperService.class)
          .chatMemory(chatMemory)
          .chatModel(qwenChatModel)
          .build();
  return build;
}

5.测试即可

相关推荐
IronMurphy2 分钟前
Redis拷打第六讲
redis·spring·mybatis
海兰5 分钟前
【第54篇】Graph + Langfuse 可观测性实战
java·人工智能·spring boot·spring ai
zhishijike5 分钟前
全国行政区划sql(省市区)
数据库·sql·mysql
早川91910 分钟前
Hbase、MySQL和Redis区别
redis·mysql·hbase
笨拙的老猴子13 分钟前
JDK8 / JDK11 / JDK17 / JDK21 核心新特性对比,简单总结
java·jdk
KaMeidebaby14 分钟前
卡梅德生物技术快报|单 B 细胞抗体技术:全犬源单抗制备流程、关键参数与性能验证
前端·数据库·其他·百度·新浪微博
KG_LLM图谱增强大模型19 分钟前
scHilda:大模型与知识图谱分层融合,突破单细胞分型瓶颈
数据库·人工智能·知识图谱
牛肉烧烤屋21 分钟前
为什么大模型需要“思考模式”?
aigc·ai编程·deepseek
凯瑟琳.奥古斯特21 分钟前
力扣3654:二维矩阵连续空位统计
数据结构·数据库·算法·职场和发展