使用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.测试即可

相关推荐
yy.y--7 分钟前
Java数组逆序读写文件实战
java·开发语言
那个松鼠很眼熟w23 分钟前
3.Statement对象概述,以及Statement的弊端
数据库
BD_Marathon1 小时前
IDEA创建多级包时显示在同一行怎么办
java·ide·intellij-idea
亓才孓1 小时前
【Exception】CONDITIONS EVALUATION REPORT条件评估报告
java·开发语言·mybatis
山岚的运维笔记1 小时前
SQL Server笔记 -- 第72章:隔离级别与锁定
数据库·笔记·后端·sql·microsoft·sqlserver
硅基动力AI2 小时前
如何判断一个关键词值不值得做?
java·前端·数据库
说实话起个名字真难啊2 小时前
彻底解决openclaw的tokens焦虑
人工智能·ai·openclaw
新缸中之脑2 小时前
从零实现AI代理的长期记忆
数据库·人工智能
重生之后端学习2 小时前
78. 子集
java·数据结构·算法·职场和发展·深度优先
那起舞的日子3 小时前
斐波那契数列
java·算法